在Scala中,list被实现为链表。它有两个部分,头和尾。列表中的最后一个单元格包含Nil。
Scala中的Nil本身是一个单例,并扩展了ListNothing、如这里所记载的。
由于Nil是一个单例,它是否意味着Scala中所有List实例的end元素都有相同的对象。
发布于 2018-03-24 08:36:50
是和不。
事实上,结束标记总是单例Nil,相同的对象,最后一个元素就是前面的那个。
scala> val a = 1 :: 2 :: Nil
a: List[Int] = List(1, 2)
scala> a.last
res10: Int = 2您可能会对术语进行争论,但在这方面,编码者通常是实证主义者,而事实上,代码是这样说的。
发布于 2018-03-24 06:19:44
是的,所有列表都以名为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对象中定义的,它调用case类::,在执行类似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代表不平等)
https://stackoverflow.com/questions/49461556
复制相似问题