小编典典

如何克隆案例类实例并仅更改 Scala 中的一个字段?

all

假设我有一个案例类,它代表不同社交网络上的人物角色。该类的实例是完全不可变的,并保存在不可变集合中,最终由 Akka 演员修改。

现在,我有一个包含许多字段的案例类,我收到一条消息说我必须更新其中一个字段,如下所示:

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
并只替换一个字段,而不指定所有不变的字段?我可以把它写成一个特征并将它用于我所有的案例类吗?

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


阅读 56

收藏
2022-06-07

共1个答案

小编典典

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

val newPersona = existingPersona.copy(sentMessages = 
                   existingPersona.sentMessages + newMessage)
2022-06-07