为什么我不能在Scala子类中赋值给var?

Dan*_*owy 14 inheritance constructor scala

假设我有以下抽象类:

abstract class A (var is_happy : Boolean) {
  def toggle_happiness();
}
Run Code Online (Sandbox Code Playgroud)

现在我想定义一个实现该toggle_happiness()方法的具体类:

class B (is_happy : Boolean) extends A (is_happy) {
  def toggle_happiness() = {
    is_happy = !is_happy
  }
}
Run Code Online (Sandbox Code Playgroud)

Scala的编译器给了我:

error: reassignment to val
   is_happy = !is_happy
            ^
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我认为在我的类中is_happy引用了var由我的构造函数设置的.我和这个名字有冲突is_happy吗?

谢谢,丹

Aar*_*rup 14

看到这个问题.从本质上讲,斯卡拉认为你想分配给该构造函数的参数,is_happy而不是var,is_happy,这恰好具有相同的名称.一些解决方案是:

  • 使var抽象基类.
  • 重命名构造函数参数(例如_is_happy).由于参数名称是构造函数/方法的公共API的一部分,因此这可能是不可取的.

您很幸运,在您的情况下,在编译时检测到问题.当它未被发现时,此问题可能导致非常令人惊讶的运行时行为.

  • @Geoff可行,但参数名称是API的一部分(由于命名参数),因此它可能不是最佳选择. (2认同)