Scala中::和:::有什么区别?

95
val list1 = List(1,2)
val list2 = List(3,4)

那么

list1::list2 returns:

List[Any] = List(List(1, 2), 3, 4)

list1:::list2 returns:

List[Int] = List(1, 2, 3, 4)

我看到书中写到使用 :: 时,也会得到 List[Int] = List(1, 2, 3, 4) 的结果。我的 Scala 版本是 2.9。

2个回答

134

:: 前缀表示添加一个单独的项目,而::: 前缀则表示添加一个完整的列表。因此,如果您在 :: 前面放置一个List,它将被视为一个项目,这将导致嵌套结构。


出于性能考虑,::::: 之间有区别吗? - null
2
性能应为O(n),其中n是要前置的元素数量。 - Debilski
请纠正我如果我错了,但这个操作不是追加而是前置吗? - Janac Meena
1
一个例子会让它更容易理解。 - techkuz
@JanacMeena,这个操作是一个prepend,List 是不可变的单向链表:在连接后,一个新的头被prepend,直接引用现有的列表:它在内存中成为别名/共享。对于某些代码模式来说,它非常高效。这是由于中缀运算符的微妙之处:任何以':'结尾的运算符都是右关联的 - 它们实际上是在它们右边的类上定义的方法,而不是在它们左边。(https://dev59.com/82Up5IYBdhLWcg3wRWBD#15384749) - Luke Usherwood

31

一般来说:

  • :: - 在列表的开头添加一个元素并返回带有此元素的列表
  • ::: - 连接两个列表并返回连接后的列表

例如:

1 :: List(2, 3)             will return     List(1, 2, 3)
List(1, 2) ::: List(3, 4)   will return     List(1, 2, 3, 4)

根据您的具体问题,使用::会导致列表中嵌套另一个列表(嵌套列表),因此我相信您更喜欢使用:::

参考:官方网站上的List类


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接