在 Scala 中,Nil和 List()之间有什么区别吗?
Nil
List()
如果不是,那么哪一个更加惯用的 Scala 风格呢?既可以创建新的空列表,也可以在空列表上创建模式匹配。
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]
用户未知 显示了 Nil和 List()的运行时值是相同的。但是,它们的静态类型不是:
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) ^