Scala错误:尝试修改内容时“重新分配给val”?

时间:2016-05-12 08:47:33

标签: scala

我有以下代码来揭示问题:

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,而是它的内容......

3 个答案:

答案 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
}