Scala: Nil vs List()

在 Scala 中,NilList()之间有什么区别吗?

如果不是,那么哪一个更加惯用的 Scala 风格呢?既可以创建新的空列表,也可以在空列表上创建模式匹配。

42278 次浏览
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 更为惯用,在大多数情况下可以首选。 有问题吗?

正如用户未知的答案所显示的,它们是同一个对象。

习惯用法是 Nil,因为它漂亮而短小。但是有一个例外: 如果出于我认为的任何原因需要显式类型

List[Foo]()

Nil : List[Foo]

用户未知 显示了 NilList()的运行时值是相同的。但是,它们的静态类型不是:

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

这在用于推断类型时尤其重要,例如在折叠的累加器中:

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)
^