如何克隆一个案例类实例,并改变在斯卡拉只是一个领域?

比方说,我有一个案例类,代表人物angular色,在不同的社交networking上的人。 该类的实例是完全不可变的,并且被保存在不可变集合中,最终由Akka actor修改。

现在,我有一个很多领域的案例类,我收到一条消息,说我必须更新其中一个领域,像这样:

case class Persona(serviceName : String, serviceId : String, sentMessages : Set[String]) // Somewhere deep in an actor val newPersona = Persona(existingPersona.serviceName, existingPersona.serviceId, existingPersona.sentMessages + newMessage) 

注意我必须指定所有的字段,即使只有一个改变。 有没有办法克隆existingPersona并只replace一个领域,没有指定所有不改变的领域? 我可以把它写成一个特征,并将其用于所有的案例类吗?

如果Persona是一个类似Map的实例,那么很容易做到。

case class带有一个专门用于这种用法的copy方法:

 val newPersona = existingPersona.copy(sentMessages = existingPersona.sentMessages + newMessage) 

从2.8开始,Scala case类有一个copy方法,它利用命名/默认参数来发挥它的魔力:

 val newPersona = existingPersona.copy(sentMessages = existing.sentMessages + newMessage) 

您也可以在Persona上创build一个方法来简化使用:

 case class Persona( svcName : String, svcId : String, sentMsgs : Set[String] ) { def plusMsg(msg: String) = this.copy(sentMsgs = this.sentMsgs + msg) } 

然后

 val newPersona = existingPersona plusMsg newMsg 
 existingPersona.copy(sentMessages = existingPersona.sentMessages + newMessage)