Scala:无vs List()

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

如果不是,哪一个更具惯用斯卡拉风格? 用于在空列表上创build新的空列表和模式匹配。

 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 

零是更习惯性,可以在大多数情况下,首选。 有问题吗?

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

 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 

当它用于推断types时,这是特别重要的,例如在一个褶皱的累加器中:

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

当用户未知的答案显示,他们是同一个对象。

在理论上,零应该是首选,因为它是好的和短的。 虽然有一个例外:如果出于某种原因我需要明确的types

 List[Foo]() 

比…更好

 Nil : List[Foo]