В чем разница между оператором scala :::
и ++
? В соответствии с doc поведение одинаковое.
Разница между List: operator и ++
Ответ 1
Они делают то же самое, за исключением того, что ++
может использоваться с любыми Traversable
и :::
может использоваться только со списками. Кроме того, методы, которые заканчиваются на :
, вызываются на объект справа, так что аргумент :::
является префиксом, а аргумент ++
является суффиксом.
Ответ 2
Поведение такое же. Разница заключается в типах, которые они принимают.
:::
принимает только List
. ++
accepts - это диапазон типов от [B >: A, That]
, означающий, что ++
будет принимать тип, нижняя граница которого List
, а верхняя граница GenTraversableOnce[B]
и между ними.
Итак, в диаграммах иерархии типов допустимы классы, расширяющие признак 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
Также см. заметку Кима о ассоциативности.
Ответ 3
@lukas, этот пост может быть полезен также. Как интерпретировать: из Scala API для списка? Ответы, заданные другими на вопрос в этой должности (мой), помогли понять, что делает метод:, хотя он не противопоставляет его методу ++. Но я думал, что это может помочь.