为什么我能够使用传递给类定义的参数?

时间:2012-10-10 07:28:04

标签: scala

我刚刚学习了类和对象以及Scala,昨天我看到了类似的东西:

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

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

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

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

  def increaseByOne = bar + 1
}

2 个答案:

答案 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();
    ()
  }
}