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

+0

我该如何使用加盖的班级?我没有看到'Stamped.copy'如何做和'NodeUpdate.copy'不同的东西' – Hamy 2014-09-24 19:07:34

+0

您可能希望为'NodeUpdate'添加'stamped'方法。在创建一个'NodeUpdate'的实例后,你可以调用'stamped'来创建一个'Stamped'的实例:'def stamped = Stamped(this)'' – 2014-09-24 20:12:00