當我做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
}