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描述了一种基于反射的方法,也适用于“非案例类” 。你可以将他的 trait 用作任何类的 mixin。

于 2013-06-25T12:26:39.637 回答