Scala模式匹配一直在说;匹配并不详尽&引用;
我想利用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
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
也是抽象的。这是如何回答这个问题的?