如何克隆一个案例类实例,并改变在斯卡拉只是一个领域?
比方说,我有一个案例类,代表人物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)