Scala列表中的最后一个元素?
在Scala中,列表实现为链表。它有两个部分,头和尾。列表中的最后一个单元格包含Nil Scala中的Nil本身就是一个单例,它扩展了列表[Nothing],Scala列表中的最后一个元素?,scala,list,Scala,List,在Scala中,列表实现为链表。它有两个部分,头和尾。列表中的最后一个单元格包含Nil Scala中的Nil本身就是一个单例,它扩展了列表[Nothing], 由于Nil是一个单例,这是否意味着Scala中所有列表实例的end元素都有相同的对象。是的,所有列表都以称为Nil的空列表结尾 通过尝试创建一个末尾没有Nil的列表,可以看出这是正确的 val a=1::2//失败 val a=1::Nil//成功 val a=scala.collection.immutable::(1,Nil)//成
由于Nil是一个单例,这是否意味着Scala中所有列表实例的end元素都有相同的对象。是的,所有列表都以称为Nil的空列表结尾 通过尝试创建一个末尾没有Nil的列表,可以看出这是正确的
val a=1::2
//失败
val a=1::Nil
//成功
val a=scala.collection.immutable::(1,Nil)
//成功
最后一个案例调用了:
的案例类构造函数,它扩展了列表
,因此创建了一个列表
。
案例类的代码是
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)
您还可以看到List
上的map
操作的代码如何在列表中迭代,直到达到Nil
取自List
类中的map
函数的代码段
while (rest ne Nil) {
val nx = new ::(f(rest.head), Nil)
t.tl = nx
t = nx
rest = rest.tail
}
(ne代表不相等)是和否。
事实上,结束标记始终是单例Nil,即同一个对象,最后一个元素是前面的元素
scala> val a = 1 :: 2 :: Nil
a: List[Int] = List(1, 2)
scala> a.last
res10: Int = 2
您可能会对术语产生争议,但在这方面,编码人员通常是实证主义者,事实上,代码是这么说的。也张贴在这里:这意味着在内存级别上,Nil确实是所有列表实例的最后一个元素,但从程序员的角度来看,scala告诉我们最后一个元素是倒数第二个元素,作为编码员,我更愿意说,Nil不是列表中的一个元素,而是一个标记,列表结束了。既然列表是抽象的,谁知道具体的列表是如何在内存中实现和分布的呢?既然我们说Nil是一个空列表,那么从这个角度来看,Nil是该列表的一个元素,这是不一致的。空列表的大小也是0。我认为您可能不会对术语进行争论。列表是密封的,您得到的只是
:
和Nil
。最后一个::
的尾部为Nil
;它的头是最后一个元素。