Сопоставление с шаблоном Scala постоянно повторяет "совпадение не является исчерпывающим!"
Я хочу использовать предупреждение о том, что Scala выдает сообщение об отсутствии соответствия ("не исчерпывающее"), чтобы не забыть одно (у меня есть десятки). Следующий упрощенный пример показывает мою попытку:
sealed case class MESSAGE()
class SUCCESS_MESSAGE extends MESSAGE
class FAILURE_MESSAGE extends MESSAGE
def log(str: String, msgType: MESSAGE) {
msgType match {
case t:SUCCESS_MESSAGE => println("FAILURE: " + str)
case t:FAILURE_MESSAGE => println("SUCCESS: " + str)
}
}
Проблема в том, что он говорит: "Матч не является исчерпывающим!" хотя все возможные комбинации перечислены. Если бы я поместил туда "case _ =>", весь смысл предупреждения для меня недействителен, потому что я мог бы добавить
class INFO_MESSAGE extends MESSAGE
и никакое предупреждение не будет выдано.
Есть ли решение?
2 ответа
В идеале, вы не должны расширять конкретный класс, и особенно не класс случая!
Учитывая, что нет возможности настроить SUCCESS_MESSAGE
а также FAILURE_MESSAGE
Вы, вероятно, также хотите сделать эти синглтоны.
Наконец, подчеркивание - это плохая вещь в именах переменных или классов Scala. Все имена UPPERCASE также не являются идиоматическими. Так:
sealed trait Message
case object SuccessMessage extends Message
case object FailureMessage extends Message
def log(str: String, msgType: Message) = msgType match {
case SuccessMessage => println("Success: " + str)
case FailureMessage => println("Failure: " + str)
}
В качестве альтернативы, и я бы порекомендовал это, вы можете обернуть фактическую строку сообщения:
sealed trait Message { def msg: String }
case class Success(msg:String) extends Message
case class Failure(msg:String) extends Message
def log(msg: Message) = msg match {
case Success(str) => println("Success: " + str)
case Failure(str) => println("Failure: " + str)
}
Вы пропустили один случай: сообщение может быть экземпляром MESSAGE
не один из его подклассов.
Если вы хотите сделать этот случай невозможным, вам нужно сделать MESSAGE
Аннотация. Это заставит предупреждение уйти.