gpt4 book ai didi

Scala 模式匹配一​​直说 "match is not exhaustive!"

转载 作者:行者123 更新时间:2023-12-02 20:57:55 28 4
gpt4 key购买 nike

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

关于Scala 模式匹配一​​直说 "match is not exhaustive!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015144/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com