0

Scala にクラスがあるとしましょう:

class Class123(val val1: Int, val val2: String, val val3: AnotherClass, val val4: AnotherClass2)

//I create Class123 somehow, it doesn't matter how exactly
val class123_1: Class123 = parseClass123()

そして今、最後のパラメーターを除いてClass123まったく同じの別のインスタンスを作成したいのですが、それを異なるものにしたいです:class123_1val4

val class123_2 = // the same as class123_1 but with different last parameter val4

それ、どうやったら出来るの?

4

4 に答える 4

2

クラスをケース クラスに変換します。

scala> case class Class123(val val1: Int, val val2: Int, val val3: Int, val val4: Int)
// defined class Class123

scala> val foo = Class123(1,2,3,4)
// foo: Class123 = Class123(1,2,3,4)

scala> val bar = foo.copy(val4 = -4)
// bar: Class123 = Class123(1,2,3,-4)
于 2013-06-25T11:24:35.847 に答える
2

これは、ケース クラスを使用して、名前で変更するパラメーターを指定することで実行できます。

val class123 = new Class123(...)
val copy = class123.copy(val4 = ...)

これは Scala 2.8 で導入されました。詳細については、こちらを参照してください

于 2013-06-25T11:25:02.083 に答える
2

copyすべてのcase classesにはすでにメソッドがあります。

クラスをケースクラスとして定義するだけです:

case class Class123(val1: Int, val2: String, val3: AnotherClass, val4: anotherClass2)

val c1: Class123 = ???
val c2 = c1.copy(val4 = newValue)

クラスをケースクラスにしたくない場合は、そのようなメソッドを自分で定義できます。

class Class123(val val1: Int, val val2: String, val val3: AnotherClass, val val4: anotherClass2) {
  def copy(val1: Int = val1, val2: String = val2, val3: AnotherClass = val3, val4: anotherClass2 = val4) =
    new Class123(val1, val2, val3, val4)
}
于 2013-06-25T11:25:23.020 に答える
2

Jay Conrod は、リフレクションに基づいた、「非ケース クラス」にも適したメソッドについて説明しています。copyWith彼の特性を任意のクラスのミックスインとして使用できます。

于 2013-06-25T12:26:39.637 に答える