我只是在学习类和对象以及 Scala,昨天我看到了这样的东西:
class Foo(bar: Int) {
def increaseByOne = bar + 1
}
为什么我可以bar
在方法中使用increaseByOne
?我希望方法定义抱怨不知道bar
。
我虽然定义这样一个类的正确方法是
class Foo(x: Int) {
val bar = x
def increaseByOne = bar + 1
}
我只是在学习类和对象以及 Scala,昨天我看到了这样的东西:
class Foo(bar: Int) {
def increaseByOne = bar + 1
}
为什么我可以bar
在方法中使用increaseByOne
?我希望方法定义抱怨不知道bar
。
我虽然定义这样一个类的正确方法是
class Foo(x: Int) {
val bar = x
def increaseByOne = bar + 1
}
这是 Scala 的一大优点:如果您从任何非构造函数的方法中引用构造函数参数,Scala 会自动将该构造函数变量分配给一个字段。Scala 非常有效地将您的第一个代码片段转换为第二个代码片段(带有private[this]
修饰符)。
此外,前面带有val
/的构造函数参数var
也将创建 getter/setter:
class Foo(val bar: Int)
val foo = new Foo(42);
println(foo.bar)
在这种情况下bar
,被定义为private[this]
并且可以在类定义中访问。您可以使用-Xprint:typer
以下选项进行检查:
class Foo extends java.lang.Object with ScalaObject {
<paramaccessor> private[this] val bar: Int = _;
def this(bar: Int): $line1.$read.$iw.$iw.Foo = {
Foo.super.this();
()
}
}