我有以下代码来揭示问题:
case class Best[T](x: Array[T], y: Double)
def someFunc(byRef : Best[Int]) : Unit = {
byRef.y = 5
}
我收到错误:
Multiple markers at this line:
reassignment to val
reassignment to val
为什么?我不是试图改变引用byRef,而是它的内容......
答案 0 :(得分:3)
case
类参数隐式声明为val
,并被视为类字段,这就是编译器不允许更改其值的原因。
您应该使用copy
方法,而不是更改它的值。类似的东西:
byRef.copy(y = 5)
答案 1 :(得分:1)
默认情况下,案例类为immutable
。你不能改变它的内容。
相反,您可以创建具有修改内容的新案例类:
case class Best[T](x: Array[T], y: Double)
def someFunc(byRef : Best[Int]) : Best[Int] = {
byRef.copy(y = 5)
}
实现您的需求 - 通过简单的类引入可变性。 不推荐
class Worst[T](x: Array[T], var y: Double) {
override def toString: String = s"$y:${x.toList}"
}
def someFunc2(byRef : Worst[Int]) : Unit = {
byRef.y = 5
}
val w = new Worst(Array(1), 1)
someFunc2(w)
println(w)
答案 2 :(得分:1)
这是实现我的用例和我的OP的答案的最简单方法,即我需要的是将案例类属性标记为var
:
case class Best[T](var x: Array[T], var y: Double)
def someFunc(byRef : Best[Int]) : Unit = {
byRef.y = 5
}