Scala包装案例类复制方法
问题描述:
是否可以包装一个案例类的复制方法,例如下面我想 总是设置复制案例类时的时间戳,而没有手动定义 包装的所有参数方法?Scala包装案例类复制方法
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放入案例班一般安全吗?他们是否稳定不变的对象?
答
我只是分两步做。在这种情况下,更好的名字就像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)
答
copy
是代码生成的。所以,简单的答案是第
但是,你可以声明Stamped
情况下类,将做的工作:
(你也不必写val
一个案例类的构造函数的参数val
小号自动创建。)
PS据我所知ActorRef
是不可改变的。你也可以考虑使用ActorPath
我该如何使用加盖的班级?我没有看到'Stamped.copy'如何做和'NodeUpdate.copy'不同的东西' – Hamy 2014-09-24 19:07:34
您可能希望为'NodeUpdate'添加'stamped'方法。在创建一个'NodeUpdate'的实例后,你可以调用'stamped'来创建一个'Stamped'的实例:'def stamped = Stamped(this)'' – 2014-09-24 20:12:00