假设我有一个案例类,它代表不同社交网络上的人物角色。该类的实例是完全不可变的,并且保存在不可变的集合中,最终由Akka参与者修改。
现在,我有一个包含多个字段的case类,并且收到一条消息,告诉我必须更新其中一个字段,如下所示:
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并只替换一个字段,而不指定所有不变的字段?我可以把它写成一个特征,然后在我所有的case类中使用它吗?
如果Persona是一个类似Map的实例,这将很容易做到。
发布于 2011-08-31 04:32:31
case class
附带了一个专门用于此用途的copy
方法:
val newPersona = existingPersona.copy(sentMessages =
existingPersona.sentMessages + newMessage)
发布于 2011-08-31 04:34:15
从2.8开始,Scala case类有了一个copy
方法,它利用命名/默认参数来发挥它的魔力:
val newPersona =
existingPersona.copy(sentMessages = existing.sentMessages + newMessage)
您还可以在Persona
上创建一个方法来简化使用:
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
发布于 2011-08-31 04:32:28
existingPersona.copy(sentMessages = existingPersona.sentMessages + newMessage)
https://stackoverflow.com/questions/7249396
复制相似问题