簡體   English   中英

Scala特征(或抽象類):在實例實例化時設置時間戳變量(或參數)

[英]scala trait (or abstract class): set a timestamp variable (or parameter) at instantiation of instance

我有一個特征,並從中繼承了幾個案例類。 像這樣:

sealed trait Event
case class Meeting(name: String)
case class Call(number: String)

我想為每個事件實例添加一個時間戳。 這個想法是為每個類實例設置實例化期間的時間戳。 將它放在每種情況下的類定義中很容易。 但是我想知道是否可以將它放入Event

給定大小寫類的語義( .equals.hashCode.toString等),您可能更喜歡這樣:

import java.time.LocalDateTime

sealed trait Event {
  val time: LocalDateTime
}

final case class Meeting(name: String, override val time: LocalDateTime = LocalDateTime.now())
extends Event

final case class Call(number: String, override val time: LocalDateTime = LocalDateTime.now())
extends Event

誠然,這不是那么優雅,但是它將更加一致地工作。 例如,考慮以下Scala REPL會話:

scala> val m1 = Meeting("Some meeting")
m1: Meeting = Meeting(Some meeting,2017-10-27T17:15:37.389)

scala> val m2 = Meeting("Some meeting")
m2: Meeting = Meeting(Some meeting,2017-10-27T17:15:46.829)

scala> m1 == m2
res0: Boolean = false

m1m2不相等,因為它們的開始時間不同。

您還可以利用案例類的全部功能,按時間進行模式匹配等,同時還將MeetingCall視為Event 例如:

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}"
}

由於可以包括明確的開始時間,因此該版本也更易於測試。

您可以在特征中聲明它

  sealed trait Event {
    val time = LocalDateTime.now()
  }
  case class Meeting(name: String) extends Event
  case class Call(number: String) extends Event

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM