Aku sudah mencoba:
class Foo(bar: Int)
vs:
class Foo(private val bar: Int)
dan mereka tampaknya berperilaku sama meskipun saya tidak dapat menemukan di mana pun yang mengatakan bahwa (bar:
Int)
memperluas (private val bar: Int)
pertanyaan saya adalah, apakah ini identik / mirip?
Di samping catatan, saya telah mencoba untuk menggunakan -Xprint:typer
potongan kode ini dan mereka menghasilkan kode yang sama kecuali untuk baris tambahan di yang kedua. Bagaimana saya membaca baris ekstra itu?
..
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>();
()
}
}
..
sumber
val
.var
tersedia dan bermakna untuk merender parameter konstruktor menjadi properti kelas (bisa berubah) baik di kelas non-case
maupuncase
.bar: Int
disusun untukprivate[this] val bar: Int
Dalam kasus pertama,
bar
hanya parameter konstruktor. Karena konstruktor utama adalah konten dari kelas itu sendiri, maka dapat diakses di dalamnya, tetapi hanya dari contoh ini saja. Jadi hampir setara dengan:Di sisi lain, dalam kasus kedua
bar
adalah bidang pribadi normal , sehingga dapat diakses ke instance ini dan contoh lain dariFoo
. Sebagai contoh, ini mengkompilasi dengan baik:Dan berjalan:
Tetapi ini tidak:
sumber
bar: Int
danprivate val ...
.