Scala コンストラクタのパラメータはデフォルトで private val になりますか? 質問する

Scala コンストラクタのパラメータはデフォルトで private val になりますか? 質問する

努力しています:

class Foo(bar: Int)

対:

class Foo(private val bar: Int)

(bar: Int)これらは同じように動作するように見えますが、それが展開されると言っているところはどこにも見つからなかったので、(private val bar: Int)私の質問は、これらは同一/類似しているかどうかです。

ちなみに、-Xprint:typerこれらのコード部分で を使用しようとしたところ、2 番目のコードに余分な行が 1 行あることを除いて、同じコードが生成されました。その余分な行はどのように読み取ればよいですか?

..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..


..
class Foo extends scala.AnyRef {
  <paramaccessor> private[this] val bar: Int = _;
  <stable> <accessor> <paramaccessor> private def bar: Int = Foo.this.bar;
  def <init>(bar: Int): this.Foo = {
    Foo.super.<init>();
    ()
  }
}
..

ベストアンサー1

bar: Int

これは、ほとんどコンストラクタ パラメータではありません。この変数がコンストラクタ以外で使用されない場合は、そこに残ります。フィールドは生成されません。それ以外の場合は、private val barフィールドが作成され、パラメータの値barが割り当てられます。ゲッターは作成されません。

private val bar: Int

このようなパラメータの宣言は、プライベート ゲッターを持つフィールドを作成しますprivate val bar。この動作は、パラメータがコンストラクターの横で使用されたかどうか (たとえば、intoString()かどうか) に関係なく、上記と同じです。

val bar: Int

上記と同じですが、Scalaのようなゲッターは公開されています

bar: Intケースクラスの場合

ケース クラスが関係する場合、デフォルトでは各パラメーターにval修飾子が付きます。

おすすめ記事