1. ホーム
  2. スカラ

[解決済み】Scalaでケースクラスのインスタンスをクローンして、1つのフィールドだけを変更するにはどうすればよいですか?

2022-04-07 11:22:47

質問

例えば、異なるソーシャルネットワーク上の人々であるペルソナを表すケースクラスがあるとします。そのクラスのインスタンスは完全にイミュータブルで、イミュータブルコレクションに保持され、最終的には Akka アクターによって変更されます。

さて、多くのフィールドを持つケースクラスがあり、その中の1つのフィールドを更新しなければならないというメッセージを受け取りました。

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)

1つしか変更されないのに、すべてのフィールドを指定しなければならないことに注意してください。既存のPersonaを複製して、変更されないフィールドをすべて指定せずに、1つのフィールドだけを置き換える方法はありますか? これをtraitとして記述し、すべてのcaseクラスで使用することはできますか?

ペルソナがMapのようなインスタンスだったら、簡単にできそうですね。

どのように解決するのか?

case class がついてきます。 copy メソッドは、まさにこの使い方に特化したものです。

val newPersona = existingPersona.copy(sentMessages = 
                   existingPersona.sentMessages + newMessage)