Scala列表中的最后一个元素?

时间:2018-03-24 05:27:42

标签: scala list

在Scala中,List实现为链接列表。它有2个部分,头部和尾部。 List中的最后一个单元格包含Nil。

Scala中的Nil本身就是一个单例并且扩展了List [Nothing], as documented here

由于Nil是单例,它是否意味着Scala中所有List实例的end元素具有相同的对象。

2 个答案:

答案 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)

您还可以看到mapList操作的代码如何遍历列表,直到达到Nil。

map

中的List函数获取的代码段
while (rest ne Nil) {
          val nx = new ::(f(rest.head), Nil)
          t.tl = nx
          t = nx
          rest = rest.tail
        }

(ne代表不相等)