当我做4 ::无,我得到列表(4)。我可以理解它,因为当一个空列表被预置为4时,它会给出单个元素列表。但是当我做Nil :: Nil时,我得到带有单个空列表的List(即List(List())),为什么它的行为如此?为什么Nil :: Nil会返回List(List())?
由于
当我做4 ::无,我得到列表(4)。我可以理解它,因为当一个空列表被预置为4时,它会给出单个元素列表。但是当我做Nil :: Nil时,我得到带有单个空列表的List(即List(List())),为什么它的行为如此?为什么Nil :: Nil会返回List(List())?
由于
在斯卡拉,Nil
代表一个空列表或List()
。 ::
运算符接受一个元素并将其添加到列表的开头。它不连接两个列表。例如,1::List(2,3,4)
返回List(1,2,3,4)
。
所以,当你做4::Nil
或4::List()
它返回List(4)
。同样,Nil::Nil
或List()::List()
取空列表并将其添加到其他空列表的开头。所以你得到List(List())
。
但是,如果使用连接运算符:::
即Nil:::Nil
,它会连接两个空列表并返回另一个空列表List()
。
右手Nil
是空列表,和以前一样,但是列表的类型被元件设置被预先考虑到它。在这种情况下,这是左手Nil
,因此将其视为预先添加到(右侧)列表中的新元素。由于Nil
的类型是List[_]
(对于某些 - 此处未确定 - 类型_
),右侧Nil
所代表的列表的类型将为List[List[_]]
- 列表的列表。
另一种方式来理解它是如何工作的,这将是使用:
List(1, 2, 3, 4) match {
case firstElem :: tailOfList => println(tailOfList) // List(2, 3, 4)
case _ => // do something else
}