在Scala中,如何在类的主构造函数中定义局部参数?

Der*_*har 8 constructor scala

在Scala中,如何在不是数据成员的类的主构造函数中定义局部参数,例如,仅用于初始化基类中的数据成员?

例如,在下面的代码中,如何b在类的主构造函数中正确定义参数,B以便它只生成临时本地参数而不是数据成员?

class A(var a: Int)
class B(?b?) extends A(b)
Run Code Online (Sandbox Code Playgroud)

Randall,你的答案解释了当我引入一个inc增加属性的方法时Scala编译器抱怨的原因a,但是也改变了类B构造函数中参数的名称以匹配类构造函数中参数的名称A:

class A(var a: Int)
class B(a: Int) extends A(a) {
  def inc(value: Int) { this.a += value }
}
Run Code Online (Sandbox Code Playgroud)

Scala编译器输出:

$ scala construct.scala
construct.scala:3: error: reassignment to val
  def inc(value: Int) { this.a += value }
                               ^
one error found
Run Code Online (Sandbox Code Playgroud)

Scala抱怨因为引用in 而类B必须现在具有私有的只读属性.更改以生成不同的编译器错误:aaincB(a: Int)B(var a: Int)

construct.scala:2: error: error overriding variable a in class A of type Int;
 variable a needs `override' modifier
class B(var a: Int) extends A(a) {
            ^
one error found
Run Code Online (Sandbox Code Playgroud)

添加override也无济于事:

construct.scala:2: error: error overriding variable a in class A of type Int;
 variable a cannot override a mutable variable
class B(override var a: Int) extends A(a) {
                 ^
one error found
Run Code Online (Sandbox Code Playgroud)

如何在主构造函数的参数中使用B与基类主构造函数中定义的属性相同的名称A

Ran*_*ulz 16

如果从构造函数参数中删除"var"或"val"关键字,则它不会生成属性.

但请注意,非var,非val构造函数参数是范围内的,并且可在整个类中访问.如果在非构造函数代码中使用一个代码(即,在方法体中),则生成的类中将存在一个隐藏该构造函数参数的不可见私有字段,就像您将其设置为"private var"或" private val"构造函数参数.

附录(迟到总比没有好)?

在此代码中,构造函数参数的引用仅在构造函数体中发生:

class C1(i: Int) {
  val iSquared = i * i
  val iCubed = iSquared * i
  val iEven = i - i % 2
}
Run Code Online (Sandbox Code Playgroud)

...这里的值i仅在构造函数执行期间存在.

但是,在下面的代码中,因为构造函数参数在方法体中引用 - 它不是构造函数体的一部分 - 构造函数参数必须复制到生成的类的(私有)字段(增加其内存需求由保持a Int)所需的4个字节:

class C2(i: Int) {
  val iSquared = i * i
  val iCubed = iSquared * i
  val iEven = i - i % 2

  def mod(d: Int) = i % d
}
Run Code Online (Sandbox Code Playgroud)