我想利用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
并且不会发出警告。
有解决方案吗?
答案 0 :(得分:33)
理想情况下,您不应该扩展具体类,尤其不是案例类!
鉴于没有可能自定义SUCCESS_MESSAGE
和FAILURE_MESSAGE
,您可能还想制作这些单身人士。
最后,下划线是Scala变量或类名中的Bad Thing(tm)。所有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)
}
答案 1 :(得分:29)
您错过了一个案例:该消息可能是MESSAGE
的实例,而不是其子类之一。
如果你想让这个案子不可能,你需要提出MESSAGE
摘要。这将使警告消失。