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

时间:2013-06-25 11:22:13

标签: 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完全相同,除了最后一个参数val4,我希望它与众不同:

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

我该怎么做?

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

您可以使用案例类并指定要按名称更改的参数。

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

这是在Scala 2.8中引入的,并且有more info here

答案 2 :(得分:2)

所有copy es。

中已有方法case class

您应该将您的类定义为案例类:

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

答案 3 :(得分:2)

Jay Conrod描述here基于反射的copyWith方法,也适用于“非案例类”。您可以将他的特质用作任何课程的混音。