首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala列表中的最后一个元素?

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

Stack Overflow用户
提问于 2018-03-24 05:27:41
回答 2查看 9K关注 0票数 4

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

Scala中的Nil本身是一个单例,并扩展了ListNothing、如这里所记载的

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-24 08:36:50

是和不。

事实上,结束标记总是单例Nil,相同的对象,最后一个元素就是前面的那个。

代码语言:javascript
复制
scala> val a = 1 :: 2 :: Nil
a: List[Int] = List(1, 2)

scala> a.last
res10: Int = 2

您可能会对术语进行争论,但在这方面,编码者通常是实证主义者,而事实上,代码是这样说的。

票数 11
EN

Stack Overflow用户

发布于 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。案例类::的代码是..。

代码语言:javascript
复制
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的操作时为您创建一个列表。

如图所示:

代码语言:javascript
复制
  def ::[B >: A] (x: B): List[B] =
    new scala.collection.immutable.::(x, this)

您还可以看到map操作在List上的代码如何遍历列表,直到到达Nil为止。

map函数中提取的List类片段

代码语言:javascript
复制
while (rest ne Nil) {
          val nx = new ::(f(rest.head), Nil)
          t.tl = nx
          t = nx
          rest = rest.tail
        }

(ne代表不平等)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49461556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档