Scala包装案例类复制方法

时间:2014-09-24 18:09:05

标签: scala copy case-class

是否可以包装案例类的复制方法,例如下面我想要的地方 始终在复制案例类时设置时间戳,而无需手动定义 包装方法的所有参数?

case class NodeUpdate(val ip: String,
  val actor: Option[ActorRef] = None,
  val status: Status = Offline,
  val asOf: Long = System.currentTimeMillis) {

  // Error type mismatch; found : Seq[Any] required: String
  def stampedCopy(values: Any*) = copy(values, asOf = System.currentTimeMillis)

  // This works but needs to be updated for each modification
  // So I would prefer to use something like what I have above
  def stampedCopy2(ip: String = ip, actor: Option[ActorRef] = actor, status: Status = status) =
    copy(ip, actor, status, System.currentTimeMillis)

}

编辑:如果有人知道,请快速跟进 - 将Akka ActorRef放入案例类通常是否安全?它们是稳定的不可变对象吗?

2 个答案:

答案 0 :(得分:1)

我会分两步完成。在这种情况下,更好的名称将类似于updateTime。

  case class NodeUpdate(val ip: String,
    val asOf: Long = System.currentTimeMillis) {

    // Error type mismatch; found : Seq[Any] required: String
    def stampedCopy() = copy(asOf = System.currentTimeMillis)
  }

  val update1 = NodeUpdate("ip")                  //> update1  : NodeUpdate(ip,1411585428244)
  val update2 = update1.stampedCopy               //> update2  : NodeUpdate(ip,14115 85428456)
  val update3 = update1.copy(ip="ip3").stampedCopy//> update3  : NodeUpdate(ip3,1411585597836)

答案 1 :(得分:0)

copy是生成的代码。所以简短的回答是否。

但是,您可以声明将执行此任务的Stamped案例类:

case class Stamped[T](data:T, asOf: Long = System.currentTimeMillis)

(此外,您无需为案例类的构造函数参数编写valval是自动创建的。)

P.S。据我所知ActorRef是不可变的。您还可以考虑使用ActorPath