scala trait(或抽象类):在实例实例化时设置时间戳变量(或参数)

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

我有一个特性,几个case类继承自它。大概是这样的:

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}"
}
这个版本也更容易测试,因为可以包括显式的开始时间