Сопоставление с шаблоном Scala постоянно повторяет "совпадение не является исчерпывающим!" - PullRequest
8 голосов
/ 25 октября 2010

Я хочу использовать предупреждение, которое выдает 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 ]

33 голосов
/ 25 октября 2010

В идеале, вы не должны расширять конкретный класс, и особенно не класс case!

Учитывая, что нет возможности настроить SUCCESS_MESSAGE и FAILURE_MESSAGE, вы, вероятно, также захотите сделать этоsingletons.

Наконец, подчеркивание - это плохая вещь в именах переменных или классов 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)
}
29 голосов
/ 25 октября 2010

Вы пропустили один случай: сообщение может быть экземпляром MESSAGE, а не одним из его подклассов.

Если вы хотите сделать этот случай невозможным, вам нужно сделать MESSAGE абстрактным. Это заставит предупреждение исчезнуть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...