Scala 克隆类的实例,但不完全是

Scala 克隆类的实例,但不完全是,scala,Scala,假设我在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_1完

假设我在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_1
完全相同,除了最后一个参数
val4
,我希望它不同:

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

我该怎么做

将类转换为案例类:

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)

您可以使用case类并通过名称指定要更改的参数来执行此操作

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

这是在Scala 2.8中引入的,在所有的
案例类中已经有了方法
copy

您应该将类定义为case类:

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)
}
如果您不想让您的类成为案例类,您可以自己定义此类方法:

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)
}

Jay Conrod描述了一种基于反射的
copyWith
方法,同样适用于“非案例类”。你可以用他的特质作为任何类的混和词。

顺便说一句,它不使用case类,有没有办法做到这一点?@MariusKavansky:你可以自己定义这种方法。Case类为您提供了一个自动生成的实现。