Saya telah melihat daftar survei yang diambil di scala-lang.org dan melihat pertanyaan yang aneh: " Bisakah Anda menyebutkan semua penggunaan" _ "? ". Bisakah kamu? Jika ya, silakan lakukan di sini. Contoh-contoh penjelasan dihargai.
540
Jawaban:
Yang bisa saya pikirkan adalah
Jenis eksistensial
Parameter jenis yang lebih tinggi
Variabel yang diabaikan
Parameter yang diabaikan
Nama tipe diri yang diabaikan
Pola wildcard
Pola wildcard dalam interpolasi
Urutan wildcard dalam pola
Impor wildcard
Menyembunyikan impor
Menggabungkan surat dengan operator
Operator penugasan
Sintaksis placeholder
Nilai metode
Mengubah parameter panggilan-nama-ke fungsi
Penginisialisasi default
Mungkin ada orang lain yang saya lupa!
Contoh menunjukkan mengapa
foo(_)
danfoo _
berbeda:Contoh ini berasal dari 0__ :
Dalam kasus pertama,
process _
merupakan metode; Scala mengambil metode polimorfik dan berupaya membuatnya monomorfik dengan mengisi parameter tipe, tetapi menyadari bahwa tidak ada tipe yang dapat diisi untukA
yang akan memberikan tipe(_ => Unit) => ?
(Eksistensial_
bukan tipe).Dalam kasus kedua,
process(_)
adalah lambda; saat menulis lambda tanpa tipe argumen eksplisit, Scala menyimpulkan tipe dari argumen yangforeach
diharapkan, dan_ => Unit
merupakan tipe (padahal_
sebenarnya tidak), sehingga dapat diganti dan disimpulkan.Ini mungkin merupakan gotcha paling sulit di Scala yang pernah saya temui.
Perhatikan bahwa contoh ini dikompilasi dalam 2.13. Abaikan saja seolah-olah ditugaskan ke garis bawah.
sumber
val x: Any = _
println _
danprintln(_)
berbeda. Anda dapat melihat ini sebagai contoh karena mereka menangani tipe eksistensial dan polimorfik sedikit berbeda. Akan muncul dengan sedikit contoh.Dari (entri saya) di FAQ , yang tentu saja saya tidak menjamin akan lengkap (saya menambahkan dua entri hanya dua hari yang lalu):
Ini juga bagian dari pertanyaan ini .
sumber
var i: Int = _
atau kasus khusus pencocokan polaval (a, _) = (1, 2)
atau kasus khusus dari val dibuangfor (_ <- 1 to 10) doIt()
def f: T; def f_=(t: T)
kombo untuk membuat f member yang bisa berubah._
pada nama metode curang. Tapi baiklah. Saya hanya berharap orang lain memperbarui FAQ ... :-)Penjelasan yang bagus tentang penggunaan garis bawah adalah sihir Scala _ [garis bawah] .
Contoh:
Di Scala,
_
tindakan serupa dengan*
di Jawa saat mengimpor paket.Dalam Scala, pengambil dan penyetel akan secara implisit didefinisikan untuk semua vars non-pribadi dalam suatu objek. Nama pengambil sama dengan nama variabel dan
_=
ditambahkan untuk nama penyetel.Pemakaian:
Jika Anda mencoba untuk menetapkan fungsi ke variabel baru, fungsi akan dipanggil dan hasilnya akan ditugaskan ke variabel. Kebingungan ini terjadi karena kawat gigi opsional untuk pemanggilan metode. Kita harus menggunakan _ setelah nama fungsi untuk menetapkannya ke variabel lain.
sumber
List(1,2,3,4,5).foreach(print(_))
itu jauh lebih mudah untuk dilakukanList(1,2,3,4,5).foreach(print)
, Anda bahkan tidak benar-benar membutuhkan garis bawah sama sekali, tapi saya rasa itu hanya masalah gayaAda satu penggunaan yang bisa saya lihat semua orang di sini sepertinya lupa daftar ...
Daripada melakukan ini:
Anda bisa melakukannya:
sumber
n => n
Berikut adalah beberapa contoh di mana
_
digunakan:Dalam semua contoh di atas satu garis bawah mewakili elemen dalam daftar (untuk mengurangi garis bawah pertama mewakili akumulator)
sumber
Selain penggunaan yang disebutkan JAiro, saya suka yang ini:
Jika seseorang membutuhkan semua properti koneksi, ia dapat melakukan:
Jika Anda hanya membutuhkan host dan port, Anda dapat melakukan:
sumber
Ada contoh spesifik yang digunakan "_":
mungkin sama dengan:
Menerapkan “_” dalam beberapa skenario akan secara otomatis dikonversi menjadi “(x $ n) => x $ n”
sumber