gpt4 book ai didi

scala - Scala 中的列表 - 加冒号与双冒号(+: vs::)

转载 作者:行者123 更新时间:2023-12-01 23:10:20 25 4
gpt4 key购买 nike

我对 +: 有点困惑和 ::可用的运算符。

看起来它们都给出了相同的结果。

scala> List(1,2,3)
res0: List[Int] = List(1, 2, 3)

scala> 0 +: res0
res1: List[Int] = List(0, 1, 2, 3)

scala> 0 :: res0
res2: List[Int] = List(0, 1, 2, 3)

对于我的新手来说,这两种方法的源代码看起来很相似(加冒号方法在使用构建器工厂的泛型上有附加条件)。

应该使用这些方法中的哪一种以及何时使用?

最佳答案

+: 适用于任何类型的集合,而 ::List 的特定实现。如果你看source对于 +: 密切关注,您会注意到当预期返回类型为 List 时,它实际上调用了 ::。这是因为 :: 对于 List 情况实现得更高效:它只是将新头连接到现有列表并返回结果,这是一个常数时间操作,而不是在 +: 的一般情况下线性复制整个集合。

另一方面,

+: 采用 CanBuildFrom,因此您可以做一些奇特的事情(尽管在本例中看起来不太好),例如:

val foo: Array[String] = List("foo").+:("bar")(breakOut)

(在这种特殊情况下,这是非常无用的,因为您可以从所需的类型开始,但想法是您可以在集合中添加元素,并一次性更改其类型,从而避免额外的操作复制)。

关于scala - Scala 中的列表 - 加冒号与双冒号(+: vs::),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41346590/

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