假设我有一个代表角色的案例类,不同社交网络上的人 . 该类的实例是完全不可变的,并且保存在不可变集合中,最终由Akka actor修改 .
现在,我有一个包含许多字段的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并只替换一个字段,而不指定所有不更改的字段?我可以将其作为特征编写并将其用于我的所有案例类吗?
如果Persona是一个类似Map的实例,那么很容易做到 .
4 回答
case class
附带了一个专门针对此用法的copy
方法:从2.8开始,Scala案例类有一个
copy
方法,利用命名/默认参数来实现它的魔力:您还可以在
Persona
上创建方法以简化用法:然后
考虑在
Shapeless
库中使用lens
:此外,如果您有 nested 案例类,
getter
和setter
方法可能有点单调乏味 . 通过使用镜头库,这将是一个简化的好机会 .另请参阅:
Shapeless Github / Boilerplate-free lenses for arbitrary case classes
Quicklens Github
Lens in scala