努力しています:
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
修飾子が付きます。