Câu trả lời:
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 là thành ngữ hơn và có thể được ưa thích trong hầu hết các trường hợp. Câu hỏi?
List[A]()
(không Nil
) cần thiết như một giá trị tích lũy cho FoldLeft? Ví dụ - scala> Map(1 -> "hello", 2 -> "world").foldLeft(List[String]())( (acc, el) => acc :+ el._2) res1: List[String] = List(hello, world)
Sử dụng Nil
làm công cụ tích lũy ở đây sẽ không hoạt động.
Map(1 -> "hello", 2 -> "world").foldLeft(Nil: List[String])( _ :+ _._2)
Người dùng chưa biết đã chỉ ra rằng giá trị thời gian chạy của cả hai Nil
và List()
giống nhau. Tuy nhiên, kiểu tĩnh của chúng không phải là:
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
Điều này đặc biệt quan trọng khi nó được sử dụng để suy ra một loại, chẳng hạn như trong bộ tích lũy của nếp gấp:
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
không hoạt động. Vấn đề là loại nó trả về không phải là loại mong đợi. Nó trả về List[Int]
, trong khi loại dự kiến là List[Nothing]
hoặc Nil.type
(tôi nghĩ cái trước, nhưng có thể cái sau).
Như câu trả lời của người dùng chưa biết, chúng là cùng một đối tượng.
Nil idiomatic nên được ưa thích vì nó là tốt đẹp và ngắn. Mặc dù có một ngoại lệ: nếu tôi cần một loại rõ ràng vì bất kỳ lý do gì tôi nghĩ
List[Foo]()
đẹp hơn
Nil : List[Foo]
List.empty[Foo]
một sự thay thế thứ ba.
Nil
là thành ngữ hơn.