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

In Scala, how does one define a local parameter in the primary constructor of a class that is not a data member and that, for example, serves only to initialize a data member in the base class?

For example, in the following code, how could I properly define parameter b in the primary constructor of class B so that it generates only a temporary local parameter and not a data member?

class A(var a: Int)

class B(?b?) extends A(b)

Randall, your answers explain why the Scala compiler complains when I introduce a method inc that increments the property a, but also change the name of the parameter in the class B constructor to match that of the parameter in the class A constructor:

class A(var a: Int)

class B(a: Int) extends A(a) {

def inc(value: Int) { this.a += value }

}

Scala compiler output:

$ scala construct.scala

construct.scala:3: error: reassignment to val

def inc(value: Int) { this.a += value }

^

one error found

Scala complains because class B must now have a private, read-only property a due to the reference to a in inc. Changing B(a: Int) to B(var a: Int) generates a different compiler error:

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

Adding override doesn't help, either:

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

How can I use the same name in the parameter in the primary constructor of B as the property defined in the primary constructor of the base class A?

解决方案

If you remove the "var" or "val" keyword from the constructor parameter, it does not produce a property.

Be aware, though, that non-var, non-val constructor parameters are in-scope and accessible throughout the class. If you use one in non-constructor code (i.e., in the body of a method), there will be an invisible private field in the generated class that holds that constructor parameter, just as if you made it a "private var" or "private val" constructor parameter.

Addendum (better late than never??):

In this code the references to the constructor parameter occur only in the constructor body:

class C1(i: Int) {

val iSquared = i * i

val iCubed = iSquared * i

val iEven = i - i % 2

}

... Here the value i exists only during the execution of the constructor.

However, in the following code, because the constructor parameter is referenced in a method body—which is not part of the constructor body—the constructor parameter must be copied to a (private) field of the generated class (increasing its memory requirement by the 4 bytes required to hold an Int):

class C2(i: Int) {

val iSquared = i * i

val iCubed = iSquared * i

val iEven = i - i % 2

def mod(d: Int) = i % d

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值