Scala:Nil vs List()

时间:2011-05-12 17:19:11

标签: scala

在Scala中,NilList()之间是否存在任何差异?

如果没有,哪一个是更惯用的Scala风格?用于在空列表上创建新的空列表和模式匹配。

3 个答案:

答案 0 :(得分:174)

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更惯用,在大多数情况下可能更受欢迎。 有问题吗?

答案 1 :(得分:81)

User unknown表明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

当它用于推断类型时,例如在fold的累加器中,这一点特别重要:

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

答案 2 :(得分:24)

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

惯用Nil应该是首选,因为它很好而且很短。但是有一个例外:如果出于任何原因需要显式类型我认为

List[Foo]() 

更好
Nil : List[Foo]