首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Scala中克隆一个case类实例并只更改一个字段?

如何在Scala中克隆一个case类实例并只更改一个字段?
EN

Stack Overflow用户
提问于 2011-08-31 04:28:59
回答 4查看 74K关注 0票数 221

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

现在,我有一个包含多个字段的case类,并且收到一条消息,告诉我必须更新其中一个字段,如下所示:

代码语言:javascript
复制
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的实例,这将很容易做到。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-08-31 04:32:31

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

代码语言:javascript
复制
val newPersona = existingPersona.copy(sentMessages = 
                   existingPersona.sentMessages + newMessage)
票数 336
EN

Stack Overflow用户

发布于 2011-08-31 04:34:15

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

代码语言:javascript
复制
val newPersona =
  existingPersona.copy(sentMessages = existing.sentMessages + newMessage)

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

代码语言:javascript
复制
case class Persona(
  svcName  : String,
  svcId    : String,
  sentMsgs : Set[String]
) {
  def plusMsg(msg: String) = this.copy(sentMsgs = this.sentMsgs + msg)
}

然后

代码语言:javascript
复制
val newPersona = existingPersona plusMsg newMsg
票数 49
EN

Stack Overflow用户

发布于 2011-08-31 04:32:28

代码语言:javascript
复制
existingPersona.copy(sentMessages = existingPersona.sentMessages + newMessage)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7249396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档