gpt4 book ai didi

Scala - 枚举与案例类

转载 作者:行者123 更新时间:2023-12-03 22:57:35 25 4
gpt4 key购买 nike

我创建了名为 LogActor 的 akka actor。
LogActors 的接收方法处理来自其他参与者的消息并将它们记录到指定的日志级别。

我可以通过两种方式区分不同的级别。第一个:

import LogLevel._
object LogLevel extends Enumeration {
type LogLevel = Value
val Error, Warning, Info, Debug = Value
}
case class LogMessage(level : LogLevel, msg : String)

第二个:( 编辑 )
abstract class LogMessage(msg : String)
case class LogMessageError(msg : String) extends LogMessage(msg)
case class LogMessageWarning(msg : String) extends LogMessage(msg)
case class LogMessageInfo(msg : String) extends LogMessage(msg)
case class LogMessageDebug(msg : String) extends LogMessage(msg)

哪种方式效率更高?匹配案例类或匹配枚举值需要更少的时间吗?

(我阅读了 this 问题,但没有任何关于运行时问题的答案)

最佳答案

我完全同意 Alexey 和 Dennis 的观点,在这种情况下,性能不应该打扰您,因为它更多是编译器优化的问题,而不是开发人员,而且我无法想象性能差异会变得明显的情况。

应该困扰您的是您的代码一致性,从这个意义上说,您应该根据您是要坚持使用第一个示例中正确描述的带有枚举的旧 java-ish 方法,还是最近流行的 来做出决定。代数数据类型 (ADT) 模式。您试图在第二个示例中表示后者,但有一些错误。

以下是如何使用 ADT 模式正确解决问题。

ADT 解决方案 #1

// 1. marked `sealed` to make pattern matching exhaustive
// 2. used a trait to avoid double storage of msg` and
// make the inheritance easier
sealed trait LogMessage { def msg : String }
// A better solution for isolation than names like "LogMessageError".
// Allows you to either address the members with a namespace like
// "LogMessage.Error" or do "import LogMessage._" and address them
// directly
object LogMessage {
case class Error (msg : String) extends LogMessage
case class Warning (msg : String) extends LogMessage
case class Info (msg : String) extends LogMessage
case class Debug (msg : String) extends LogMessage
}

ADT 解决方案#2

很抱歉可能弄乱了您的头脑,但值得注意的是,对于类似情况,也存在另一种 ADT 方法,这有点类似于您使用枚举的方法。
sealed trait LogLevel 
object LogLevel {
case object Error extends LogLevel
case object Warning extends LogLevel
case object Info extends LogLevel
case object Debug extends LogLevel
}
case class LogMessage ( level : LogLevel, msg : String )

关于Scala - 枚举与案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343513/

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