95 可读性
将光标移到/点击文章中的句子上,可以查看原文。 显示译文      显示原文      双语对照

scala,nil和 List( ) 比较

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

如果不是的话,哪一个更符合惯用 Scala 风格? 在空列表中创建新的空列表和模式匹配。

时间: 原作者: 3个回答


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更具惯用性,在大多数情况下都是首选的。 问题?

原作者:

用户未知的显示 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)
 ^


原作者:

作为未知显示的用户回答,它们是相同的对象。

Idiomatically Nil应该是首选的,因为它很好和短。 但有一个例外:如果需要显式类型,我认为

 
List[Foo]() 

 

要比

 
Nil : List[Foo]

 

原作者:
...