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 の優れた機能の 1 つです。コンストラクターではないメソッドからコンストラクター引数を参照すると、Scala はそのコンストラクター変数をフィールドに自動的に割り当てます。そのため、効果的に Scala は最初のコード スニペットを 2 つ目のコード スニペットに (private[this]修飾子を使用して) 変換します。

さらに、以前のコンストラクターの引数は、val/ vargetters / 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 に答える