Scala中是否存在一些语法糖,以及#34;不可变的类设置器"?
以下是一个例子:
class Bob (val x:Int, val y:String)
为了更改x
或y
,我可以这样实现:
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个参数。
有没有更好的方法来实现这一目标?
答案 0 :(得分:5)
如果你把你的班级作为案例类,你将免费获得一个复制方法。 Case类参数是自动不可变的,因此不需要在它们前面放置val。
case class Bob(x: Int, y: String)
val bob1 = Bob(1, "Bob1")
val bob2 = bob1.copy(y = "Bob2")
答案 1 :(得分:0)
正如@ {insin-e在his answer中提到的,案例类使用的模式是copy
方法,其参数与构造函数匹配,默认值与val
匹配。您可以自己轻松实现:
class Bob(val x: Int, val y: String) {
def copy(x: Int = x, y: String = y) = new Bob(x, y)
}