web-dev-qa-db-ja.com

Scalaケースクラス更新値

2つのStringメンバーを持つケースクラスがあります。 2番目のメンバーを後で更新したいので、最初にStringとNoneを使用してインスタンスを作成し、後でクラスにデータをロードして、2番目のメンバーをいくつかの値で更新します。

どうすればできますか?

23
bashan

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"))
56
Jesper

ScalaのCaseクラスは不変であることが望ましい。達成しようとしていることには通常のクラスを使用するか、更新された値を使用してCaseクラスオブジェクトを新しいものにコピーしてください。

2

あなたのケースクラスが次のようになっているとしましょう:

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つのクラスが必要ですDataWithStr2Dataを拡張し、常に設定される別の文字列を追加します。または、2つの無関係なケースクラスが必要です。1つは1つの文字列、もう1つは2つの文字列です。

1
Paul