【问题标题】:Scala pattern matching keep saying "match is not exhaustive!"Scala 模式匹配一​​直在说“匹配并不详尽!”
【发布时间】:2011-04-30 05:34:02
【问题描述】:

我想利用 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

并且不会发出警告。

有解决办法吗?

【问题讨论】:

  • SUCCESS_MESSAGE 应该打印“FAILURE:”,你确定吗?
  • 我强烈建议不要在任何情况下扩展案例类。仅供参考。

标签: scala match


【解决方案1】:

理想情况下,您不应该扩展具体类,尤其是案例类!

鉴于无法自定义 SUCCESS_MESSAGEFAILURE_MESSAGE,您可能还想制作这些单例。

最后,下划线是 Scala 变量或类名中的坏事。所有大写名称也不是惯用的。所以:

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)
}

【讨论】:

  • s/在 Scala 变量名中/在 Scala 类名中/
  • 变量或类名,如果你想准确的话:)
  • 第一个示例仍然存在同样的问题,因为Message 没有标记为abstract。第二个例子没问题,因为抽象方法msg保证Message也是抽象的。
  • 这如何回答这个问题?
【解决方案2】:

您错过了一个案例:该消息可能是MESSAGE 的一个实例,而不是它的子类之一。

如果您想让这种情况变得不可能,您需要将MESSAGE 抽象化。这将使警告消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    相关资源
    最近更新 更多