Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala列表中的最后一个元素?_Scala_List - Fatal编程技术网

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

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)//成

在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)
//成功

最后一个案例调用了
的案例类构造函数,它扩展了
列表
,因此创建了一个
列表
。 案例类的代码是

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
;它的头是最后一个元素。