2

我只是在学习类和对象以及 Scala,昨天我看到了这样的东西:

class Foo(bar: Int) {
  def increaseByOne = bar + 1
}

为什么我可以bar在方法中使用increaseByOne?我希望方法定义抱怨不知道bar

我虽然定义这样一个类的正确方法是

class Foo(x: Int) {
  val bar = x

  def increaseByOne = bar + 1
}
4

2 回答 2

7

这是 Scala 的一大优点:如果您从任何非构造函数的方法中引用构造函数参数,Scala 会自动将该构造函数变量分配给一个字段。Scala 非常有效地将您的第一个代码片段转换为第二个代码片段(带有private[this]修饰符)。

此外,前面带有val/的构造函数参数var也将创建 getter/setter:

class Foo(val bar: Int)
val foo = new Foo(42);
println(foo.bar)
于 2012-10-10T07:38:37.430 回答
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();
    ()
  }
}
于 2012-10-10T07:38:26.553 回答