代码之家  ›  专栏  ›  技术社区  ›  stephanos

Scala模式匹配一直说“匹配并不详尽!”

  •  8
  • stephanos  · 技术社区  · 14 年前

    我想利用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 回复  |  直到 12 年前
        1
  •  33
  •   Kevin Wright    14 年前

    理想情况下,您不应该扩展一个具体的类,尤其是不应该扩展case类!

    既然没有定制的潜力 SUCCESS_MESSAGE FAILURE_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)
    }
    
        2
  •  31
  •   sepp2k    14 年前

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

    如果你想让这个案子不可能,你需要 消息