scala trait(或抽象类):在实例实例化时设置时间戳变量(或参数)
我有一个特性,几个case类继承自它。大概是这样的:scala trait(或抽象类):在实例实例化时设置时间戳变量(或参数),scala,Scala,我有一个特性,几个case类继承自它。大概是这样的: sealed trait Event case class Meeting(name: String) case class Call(number: String) 我想给每个事件实例添加一个时间戳。其思想是在实例化过程中为每个类实例设置时间戳。很容易将其放在每种情况下的类定义中。但是我想知道我是否可以把它放在事件中你可以在trait中声明它 sealed trait Event { val time = LocalDateT
sealed trait Event
case class Meeting(name: String)
case class Call(number: String)
我想给每个事件实例添加一个时间戳。其思想是在实例化过程中为每个类实例设置时间戳。很容易将其放在每种情况下的类定义中。但是我想知道我是否可以把它放在
事件中你可以在trait中声明它
sealed trait Event {
val time = LocalDateTime.now()
}
case class Meeting(name: String) extends Event
case class Call(number: String) extends Event
你可以在特征中声明它
sealed trait Event {
val time = LocalDateTime.now()
}
case class Meeting(name: String) extends Event
case class Call(number: String) extends Event
给定case类语义(.equals
,.hashCode
,.toString
,等等),您可能更喜欢这样:
诚然,这并不是很优雅,但它会更稳定地工作。例如,考虑这个Scala RePL会话:
m1
和m2
不相等,因为它们有不同的开始时间
您还可以充分利用案例类的功能,在时间等方面进行模式匹配,同时将会议
和调用
视为事件
s。例如:
val events: List[Event] = //...
// Filter events that occurred in the last week.
val oneWeekAgo = LocalDateTime.now().minusDays(7)
val recent = events.filter(_.time.isAfter(oneWeekAgo))
// Convert to log messages.
val msg = recent.map {
case Meeting(n, t) => s"Meeting $n, held on ${t.toString}"
case Call(n, t) => s"Telephone call to $n, made on ${t.toString}"
}
此版本也更容易测试,因为可以包括显式的开始时间。给定的案例类语义(.equals
,.hashCode
,.toString
,等等),您可能更喜欢这样:
诚然,这并不是很优雅,但它会更稳定地工作。例如,考虑这个Scala RePL会话:
m1
和m2
不相等,因为它们有不同的开始时间
您还可以充分利用案例类的功能,在时间等方面进行模式匹配,同时将会议
和调用
视为事件
s。例如:
val events: List[Event] = //...
// Filter events that occurred in the last week.
val oneWeekAgo = LocalDateTime.now().minusDays(7)
val recent = events.filter(_.time.isAfter(oneWeekAgo))
// Convert to log messages.
val msg = recent.map {
case Meeting(n, t) => s"Meeting $n, held on ${t.toString}"
case Call(n, t) => s"Telephone call to $n, made on ${t.toString}"
}
这个版本也更容易测试,因为可以包括显式的开始时间