【问题标题】:The difference between List ::: operator and ++List ::: 运算符和++之间的区别
【发布时间】:2012-10-06 18:30:07
【问题描述】:

scala :::++ 运算符有什么区别?根据doc,行为是相同的。

【问题讨论】:

标签: list scala operators


【解决方案1】:

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

【讨论】:

  • 这有点令人困惑。其中之一应该简单地重载。谢谢。
  • 啊,我明白了,@Kim。右关联性和 ++ 在任何 Traversable 上的使用。这是有道理的。
【解决方案2】:

行为是相同的。不同之处在于他们接受的类型。

::: 只接受List++ 接受是从[B >: A, That] 开始的一系列类型,这意味着++ 将接受下限为List 上限为GenTraversableOnce[B] 以及介于两者之间的类型。

因此,在类型层次图中,扩展 trait GenTraversableOnce 并且是 List 超类型的类是有效的

一个使用 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 关于关联性的说明。

【讨论】:

  • 在行为方面A ::: B ::: C 是否等同于A ++ B ++ C?据我所知,它们是 not (操作顺序)。从这个意义上说,行为是不一样的..
  • 但结果是关联的,确实如此。
【解决方案3】:

@lukas,这篇文章也可能有用。 How to interpret ::: from the Scala API for List? 其他人对该帖子(我的)中的问题给出的答案有助于理解 ::: 方法的作用,尽管它没有与 ++ 方法进行对比。但我认为包括这可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 2016-05-18
    • 2011-10-22
    • 2010-12-30
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多