Подтвердить что ты не робот

Разница между List: operator и ++

В чем разница между оператором scala ::: и ++? В соответствии с doc поведение одинаковое.

4b9b3361

Ответ 1

Они делают то же самое, за исключением того, что ++ может использоваться с любыми Traversable и ::: может использоваться только со списками. Кроме того, методы, которые заканчиваются на :, вызываются на объект справа, так что аргумент ::: является префиксом, а аргумент ++ является суффиксом.

Ответ 2

Поведение такое же. Разница заключается в типах, которые они принимают.

::: принимает только List. ++ accepts - это диапазон типов от [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

Также см. заметку Кима о ассоциативности.

Ответ 3

@lukas, этот пост может быть полезен также. Как интерпретировать: из Scala API для списка? Ответы, заданные другими на вопрос в этой должности (мой), помогли понять, что делает метод:, хотя он не противопоставляет его методу ++. Но я думал, что это может помочь.