List :::运算符和++运算符之间的区别

25
在Scala中,:::++运算符有什么区别?根据文档描述,它们的行为是相同的。

3
可能是Scala列表连接,:::与++的区别的重复问题。 - Luigi Plinge
3个回答

37

它们做的事情是相同的,除了++可以与任何Traversable一起使用,而:::只能用于列表。另外,以:结尾的方法是在右侧对象上调用的,因此:::的参数是前缀,而++的参数是后缀。


1
有点令人困惑。其中一个应该只是被重载。谢谢。 - Lukasz Madon
1
啊,我明白了,@Kim。正确的结合性和对任何可遍历对象使用++。这很有道理。 - ilango

14
行为是相同的。不同之处在于它们接受的类型。 ::: 只接受 List。++ 接受的是一系列类型,从 [B >: A, That] 的含义是 ++ 将接受一个类型,其下限为 List,上限为 GenTraversableOnce[B],以及介于类型之间。因此,在扩展 GenTraversableOnce 特质并且是 List 超类型的类的类型层次结构图中是有效的。

List type hierarchy

一个例子使用List和LinkedList来展示这种行为。
scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

scala> val l2 = List(4,5,6)
l2: List[Int] = List(4, 5, 6)

scala> l ++ l2
res0: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> l ::: l2
res1: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> import scala.collection.mutable.LinkedList
import scala.collection.mutable.LinkedList

scala> val ll = LinkedList(1,2,3)
ll: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3)

scala> ll ++ l2
res2: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3, 4, 5, 6)

scala> ll ::: l2
<console>:11: error: type mismatch;
found   : scala.collection.mutable.LinkedList[Int]
required: List[?]
          ll ::: l2

此外,请查看Kim关于结合性的注释。

1
“A ::: B ::: C”和“A ++ B ++ C”在行为上是否等效?据我所知,它们并不等效(操作顺序不同)。从这个意义上讲,它们的行为不同。 - Marco
但结果是关联的,所以它确实是这样的。 - arviman

0

@lukas,这篇文章也许对你有用。如何解释Scala API中List的:::方法? 其他人对那篇文章中的问题给出的答案(我的问题)帮助我理解了:::方法的作用,尽管它没有与++方法进行对比。但我认为包含这个信息可能会有所帮助。


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