gpt4 book ai didi

list - 列表的::: 和++ 之间有什么区别?

转载 作者:行者123 更新时间:2023-12-04 17:10:38 24 4
gpt4 key购买 nike

给定两个列表 ab , a ::: b 和有什么区别和 a ++ b ?我怀疑这些运算符中的一个会简单地调用另一个,但实际上,实现看起来完全不同:

def :::[B >: A](prefix: List[B]): List[B] =
if (isEmpty) prefix
else if (prefix.isEmpty) this
else (new ListBuffer[B] ++= prefix).prependToList(this)

override def ++[B >: A, That](that: GenTraversableOnce[B])
(implicit bf: CanBuildFrom[List[A], B, That]): That = {
val b = bf(this)
if (b.isInstanceOf[ListBuffer[_]])(this ::: that.seq.toList).asInstanceOf[That]
else super.++(that)
}

从使用的角度来看,我应该更喜欢 a ::: ba ++ b ?从实现的角度来看,这些运算符中的一个不简单地调用另一个是否有特定的原因?

最佳答案

不同之处在于您只能使用 :::在 2 个列表上 -- 此操作仅适用于 List数据类型。由于列表是序列,因此它充当列表的连接运算符。
++方法更通用 - 它允许创建任何两个集合的联合。这可能是两个集合,在这种情况下它充当联合,或者两个序列,在这种情况下它充当串联。
++ 之间没有语义差异和 :::对于 2 个列表 -- :::++ 的变体对于函数式程序员来说应该更熟悉的函数式列表。
if您在 ++ 中看到的声明实现是一种优化——如果两者都是 this收藏和that集合是列表,只需使用列表连接运算符 :::将两个列表相加。否则,使用 ++ 的通用实现将 this 的所有元素相加和 that集合到类型 That 的适当构建器.

因此,列表的相关区别在于性能——对于功能列表,您不需要将第二个列表作为通用 ++ 遍历。实现将 - 只有第一个列表的节点需要重新实例化以创建新的功能列表。

关于list - 列表的::: 和++ 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15948375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com