Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala模式匹配一直在说;匹配并不详尽&引用;_Scala_Match - Fatal编程技术网

Scala模式匹配一直在说;匹配并不详尽&引用;

Scala模式匹配一直在说;匹配并不详尽&引用;,scala,match,Scala,Match,我想利用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:SUCCES

我想利用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
不会发出任何警告


有解决方案吗?

您遗漏了一个案例:消息可能是
消息的一个实例,而不是它的一个子类


如果您想使这种情况不可能发生,您需要将
消息
抽象化。这将使警告消失。

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

考虑到没有定制
SUCCESS\u MESSAGE
FAILURE\u MESSAGE
的潜力,您可能还想制作这些单例

最后,下划线在Scala变量或类名中是一件坏事(tm)。所有大写的名字也不是惯用的。因此:

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

SUCCESS\u消息应该打印“FAILURE:”,您确定吗?我强烈建议不要在任何情况下扩展case类。仅供参考。/在Scala变量名中/在Scala类名中/变量或类名中,如果您想准确地说:)第一个示例仍然存在相同的问题,因为
消息
没有标记
摘要
。第二个例子是可以的,因为抽象方法
msg
保证
Message
也是抽象的。这是如何回答这个问题的?