Dalam Scala, apakah ada perbedaan sama sekali antara Nil
dan List()
?
Jika tidak, gaya Scala mana yang lebih idiomatis? Baik untuk membuat daftar kosong baru dan pencocokan pola pada daftar kosong.
scala> println (Nil == List())
true
scala> println (Nil eq List())
true
scala> println (Nil equals List())
true
scala> System.identityHashCode(Nil)
374527572
scala> System.identityHashCode(List())
374527572
Nil lebih idiomatik dan dapat lebih disukai dalam banyak kasus. Pertanyaan?
Nil
lebih idiomatis.List[A]()
(tidakNil
) diperlukan sebagai nilai akumulator untuk foldLeft? Contoh -scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
MenggunakanNil
sebagai akumulator di sini tidak akan berfungsi.Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
Pengguna yang tidak dikenal telah menunjukkan bahwa nilai waktu berjalan keduanya
Nil
danList()
sama. Namun, tipe statis mereka bukan:Ini sangat penting ketika digunakan untuk menyimpulkan suatu tipe, seperti dalam akumulator lipatan:
sumber
y :: x
tidak bekerja. Masalahnya adalah bahwa jenis yang dikembalikan bukan jenis yang diharapkan. Itu kembaliList[Int]
, sementara jenis yang diharapkan adalah salah satuList[Nothing]
atauNil.type
(saya pikir yang pertama, tapi mungkin yang terakhir).Seperti yang ditunjukkan oleh jawaban yang tidak diketahui pengguna, mereka adalah objek yang sama.
Secara nihil Nil harus dipilih karena bagus dan pendek. Namun ada pengecualian: jika jenis eksplisit diperlukan untuk alasan apa pun yang saya pikirkan
lebih baik daripada
sumber
List.empty[Foo]
sebagai alternatif ketiga.