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

看起来他们两个都给出了相同的结果。

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)

(在这种特殊情况下,这是毫无用处的,因为您可以从所需的类型开始,但是您的想法是,您可以在集合中添加元素和元素,然后一次“更改”即可更改其类型,从而避免了附加副本)。

07-24 09:45
查看更多