在Scala中,List实现为链接列表。它有2个部分,头部和尾部。 List中的最后一个单元格包含Nil。
Scala中的Nil本身就是一个单例并且扩展了List [Nothing], as documented here
由于Nil是单例,它是否意味着Scala中所有List实例的end元素具有相同的对象。
答案 0 :(得分:6)
实际上,结束标记始终是单个Nil,即同一个对象,最后一个元素就是前一个。
scala> val a = 1 :: 2 :: Nil
a: List[Int] = List(1, 2)
scala> a.last
res10: Int = 2
你可能会争论这个术语,但编码员在这方面经常是实证主义者,而事实是代码所说的。
答案 1 :(得分:2)
是的,所有列表都以名为Nil的空列表结束。
你可以通过尝试在最后创建一个没有Nil的列表来实现这一点。
val a = 1 :: 2
//失败
val a = 1 :: Nil
//成功
val a = scala.collection.immutable.::(1, Nil)
//成功
最后一种情况调用::
的case类构造函数,它扩展List
,因此创建了List
。
案例类::
的代码是......
final case class ::[B](override val head: B, private[scala] var tl: List[B]) extends List[B] {
override def tail : List[B] = tl
override def isEmpty: Boolean = false
}
操作::
在List对象中定义,该对象在执行::
之类的操作时调用案例类1 :: Nil
为您创建列表。
如下所示:
def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)
您还可以看到map
上List
操作的代码如何遍历列表,直到达到Nil。
从map
类
List
函数获取的代码段
while (rest ne Nil) {
val nx = new ::(f(rest.head), Nil)
t.tl = nx
t = nx
rest = rest.tail
}
(ne代表不相等)