scala 不可变 class vals 设置器

scala immutable class vals setters

Scala 中是否存在 "immutable class setters" 的语法糖?

这是一个例子:

class Bob (val x:Int, val y:String)

为了改变xy,我可以这样实现:

object Bob {
    def updX (b:Bob) (x:Int) = new Bob (x, b.y)
    def updY (b:Bob) (y:String) = new Bob (b.x, y)
}
class Bob (val x:Int, val y:String) {
    def updX (x:Int) = Bob.updX(this)(x)
    def updY (y:String) = Bob.updY(this)(y)
}

这个解决方案很糟糕,因为我的一些 类 有 8 个参数。

有没有更好的方法来实现这个?

如果您将 class 设为案例 class,您将免费获得一个复制方法。 Case class 参数自动不可变,所以不需要在它们前面放val。

case class Bob(x: Int, y: String)

val bob1 = Bob(1, "Bob1")
val bob2 = bob1.copy(y = "Bob2")

正如@insan-e 在 中提到的那样,case 类 使用的模式是一个 copy 方法,其参数与构造函数匹配,默认值与 vals。您可以自己轻松实现:

class Bob(val x: Int, val y: String) {
  def copy(x: Int = x, y: String = y) = new Bob(x, y)
}