:::
和 ++
之间用于连接Scala中的列表有什么区别吗?
scala> List(1,2,3) ++ List(4,5)
res0: List[Int] = List(1, 2, 3, 4, 5)
scala> List(1,2,3) ::: List(4,5)
res1: List[Int] = List(1, 2, 3, 4, 5)
scala> res0 == res1
res2: Boolean = true
从the documentation看起来 ++
更为通用,而 :::
是 List
-specific . 提供后者是因为它用于其他功能语言吗?
4 回答
遗产 . 列表最初定义为功能语言:
当然,Scala以临时方式演变了其他集合 . 当2.8出来时,重新设计了集合以获得最大的代码重用和一致的API,这样你就可以使用
++
来连接任何两个集合 - 甚至是迭代器 . 然而,列表必须保留其原始运营商,除了一两个被弃用的运营商 .:::
仅适用于列表,而++
可以与任何可遍历使用 . 在当前的实现(2.9.0)中,如果参数也是List
,则++
会回退到:::
.始终使用
:::
. 有两个原因:效率和类型安全 .Efficiency
x ::: y ::: z
比x ++ y ++ z
快,因为:::
是右关联的 .x ::: y ::: z
被解析为x ::: (y ::: z)
,它在算法上比(x ::: y) ::: z
更快(后者需要O(| x |)更多步骤) .Type safety
使用
:::
,您只能连接两个List
. 使用++
,您可以将任何集合追加到List
,这很糟糕:++
也很容易与+
混淆:另一点是第一句被解析为:
而第二个例子被解析为:
所以如果你使用宏,你应该小心 .
此外,两个列表的
++
正在调用:::
,但开销更大,因为它要求一个隐式值,以便从List到List有一个构建器 . 但是microbenchmarks在这个意义上没有证明任何有用的东西,我想编译器会优化这些调用 .热身后的微观基准 .
正如Daniel C. Sobrai所说,您可以使用
++
将任何集合的内容附加到列表中,而使用:::
,您只能连接列表 .