Jawaban:
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?
List[A]()
(tidak Nil
) 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)
Menggunakan Nil
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
dan List()
sama. Namun, tipe statis mereka bukan:
scala> val x = List()
x: List[Nothing] = List()
scala> val y = Nil
y: scala.collection.immutable.Nil.type = List()
scala> def cmpTypes[A, B](a: A, b: B)(implicit ev: A =:= B = null) = if (ev eq null) false else true
cmpTypes: [A, B](a: A, b: B)(implicit ev: =:=[A,B])Boolean
scala> cmpTypes(x, y)
res0: Boolean = false
scala> cmpTypes(x, x)
res1: Boolean = true
scala> cmpTypes(y, y)
res2: Boolean = true
Ini sangat penting ketika digunakan untuk menyimpulkan suatu tipe, seperti dalam akumulator lipatan:
scala> List(1, 2, 3).foldLeft(List[Int]())((x, y) => y :: x)
res6: List[Int] = List(3, 2, 1)
scala> List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1, 2, 3).foldLeft(Nil)((x, y) => y :: x)
^
y :: x
tidak bekerja. Masalahnya adalah bahwa jenis yang dikembalikan bukan jenis yang diharapkan. Itu kembali List[Int]
, sementara jenis yang diharapkan adalah salah satu List[Nothing]
atau Nil.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
List[Foo]()
lebih baik daripada
Nil : List[Foo]
List.empty[Foo]
sebagai alternatif ketiga.
Nil
lebih idiomatis.