我刚刚学习了类和对象以及Scala,昨天我看到了类似的东西:
class Foo(bar: Int) {
def increaseByOne = bar + 1
}
为什么我可以在方法bar
中使用increaseByOne
?我希望方法定义抱怨不知道bar
。
我虽然定义这样一个类的正确方法是
class Foo(x: Int) {
val bar = x
def increaseByOne = bar + 1
}
答案 0 :(得分:7)
这是Scala的一个很棒的功能:如果你从任何不是构造函数的方法引用构造函数参数,Scala会自动将该构造函数变量赋给一个字段。因此,Scala会有效地将您的第一个代码段转换为第二个代码段(使用private[this]
修饰符)。
此外,使用val
/ var
的前面构造函数参数也将创建getter / setter:
class Foo(val bar: Int)
val foo = new Foo(42);
println(foo.bar)
答案 1 :(得分:2)
在这种情况下,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();
()
}
}