2015-09-26 108 views
0

当我做4 ::无,我得到列表(4)。我可以理解它,因为当一个空列表被预置为4时,它会给出单个元素列表。但是当我做Nil :: Nil时,我得到带有单个空列表的List(即List(List())),为什么它的行为如此?为什么Nil :: Nil会返回List(List())?

由于

回答

4

在斯卡拉,Nil代表一个空列表或List()::运算符接受一个元素并将其添加到列表的开头。它不连接两个列表。例如,1::List(2,3,4)返回List(1,2,3,4)

所以,当你做4::Nil4::List()它返回List(4)。同样,Nil::NilList()::List()取空列表并将其添加到其他空列表的开头。所以你得到List(List())

但是,如果使用连接运算符:::Nil:::Nil,它会连接两个空列表并返回另一个空列表List()

2

右手Nil是空列表,和以前一样,但是列表的类型被元件设置被预先考虑到它。在这种情况下,这是左手Nil,因此将其视为预先添加到(右侧)列表中的新元素。由于Nil的类型是List[_](对于某些 - 此处未确定 - 类型_),右侧Nil所代表的列表的类型将为List[List[_]] - 列表的列表。

0

另一种方式来理解它是如何工作的,这将是使用:

List(1, 2, 3, 4) match { 
    case firstElem :: tailOfList => println(tailOfList) // List(2, 3, 4) 
    case _ => // do something else 
}