2つのStringメンバーを持つケースクラスがあります。 2番目のメンバーを後で更新したいので、最初にStringとNoneを使用してインスタンスを作成し、後でクラスにデータをロードして、2番目のメンバーをいくつかの値で更新します。
どうすればできますか?
2番目のメンバーがvar
になるようにケースクラスを定義します。
case class Stuff(name: String, var value: Option[String])
これで、Stuff
のインスタンスを作成し、2番目の値を変更できます。
val s = Stuff("bashan", None)
s.value = Some("hello")
ただし、ケースクラスを変更可能にすることは、おそらくお勧めできません。不変のデータ構造で作業することをお勧めします。変更可能なcaseクラスを作成する代わりに、それを不変にし、copy
メソッドを使用して、値が変更された新しいインスタンスを作成します。例えば:
// Immutable Stuff
case class Stuff(name: String, value: Option[String])
val s1 = Stuff("bashan", None)
val s2 = s1.copy(value = Some("hello"))
// s2 is now: Stuff("bashan", Some("hello"))
ScalaのCaseクラスは不変であることが望ましい。達成しようとしていることには通常のクラスを使用するか、更新された値を使用してCaseクラスオブジェクトを新しいものにコピーしてください。
あなたのケースクラスが次のようになっているとしましょう:
case class Data(str1: String, str2: Option[String]
最初に、2番目の文字列をNone
に設定するインスタンスを作成します。
val d1 = Data("hello", None)
次に、このオブジェクトを新しい値にコピーして新しい値を作成し、str2の値を置き換えます。
val d2 = d1.copy(str2=Some("I finally have a value here"))
私はまた、あなたのケースクラスがあなたのデータの最良の表現ではない可能性を考慮します。おそらく1つのクラスが必要ですDataWithStr2
はData
を拡張し、常に設定される別の文字列を追加します。または、2つの無関係なケースクラスが必要です。1つは1つの文字列、もう1つは2つの文字列です。