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


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.


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.