Di Scala, apa sebenarnya arti 'val a: A = _' (garis bawah)?

120

Apa sebenarnya yang val a: A = _menginisialisasi nilai? Apakah ini null yang diketik? Terima kasih.

Gregor Scheidt
sumber
2
Sup simbol Scala .
Shelby Moore III

Jawaban:

143

val a: A = _adalah kesalahan kompilasi. Sebagai contoh:

scala> val a: String = _
<console>:1: error: unbound placeholder parameter
       val a: String = _
                       ^

Apa yang berhasil adalah var a: A = _(perhatikan varbukan val). Seperti yang dikatakan Chuck dalam jawabannya, ini menginisialisasi variabel ke nilai default. Dari Spesifikasi Bahasa Scala:

0 jika T adalah Int atau salah satu tipe subrange,
0L jika T Long,
0.0f jika T Float,
0.0d jika T Double,
false jika T adalah Boolean,
() jika T adalah Unit,
null untuk semua tipe lainnya T.

Paul Butcher
sumber
6
Ha, tangkapan yang bagus di sakelar val / var. Otak saya baru saja melewati itu.
Chuck
2
Adakah wawasan tentang mengapa ini belum dibuat untuk dikerjakan val?
Erik Kaplun
4
@ErikAllik: Ini murni spekulasi, tetapi val a: Int = _mungkin kesalahan kompilasi karena akan menjadi praktik yang buruk jika berhasil. Itu hanya akan menjadi cara penulisan yang kabur val a: Int = 0. Menyetel varke nilai default masuk akal karena a vardiharapkan berubah, tetapi a valtetap sehingga praktik terbaiknya adalah menetapkan nilai secara eksplisit.
Shuklaswag
1
@Shuklaswag: Hanya jika Anda mengetahui integernya. Saya mencoba menggunakan ini untuk menginisialisasi val dari tipe yang saya belum tahu.
Adrian Mei
33

Ini menginisialisasi ake nilai default dari tipe A. Misalnya, nilai default Int adalah 0 dan nilai default tipe referensi adalah null.

Membuang
sumber
10
Apa nilai default dari kelas yang bercampur dalam NotNullsifat tersebut? :-)
Jean-Philippe Pellet
9
@ Jean-PhilippePellet: Mulai Scala 2.9.0.1 (yang merupakan versi terbaru yang saya gunakan), nilai default dari kelas yang bercampur dalam sifat NotNull adalah - jeda dramatis - null . Saya berharap ini mungkin akan berubah di beberapa titik, tetapi saat ini tampaknya _mengalahkan NotNull.
Chuck