2014-09-24 49 views
0

是否可以包裝一個案例類的複製方法,例如下面我想 總是設置複製案例類時的時間戳,而沒有手動定義 包裝的所有參數方法?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放入案例班一般安全嗎?他們是否穩定不變的對象?

回答

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) 
0

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