Почему оператор ++: на языке Scala такой странный? - PullRequest
0 голосов
/ 16 ноября 2018

Я использую оператор ++:, чтобы получить коллекцию из двух коллекций, но результаты, которые я получаю с помощью этих двух методов, противоречивы:

scala> var r = Array(1, 2)
r: Array[Int] = Array(1, 2)
scala> r ++:= Array(3)
scala> r
res28: Array[Int] = Array(3, 1, 2)

scala> Array(1, 2) ++: Array(3)
res29: Array[Int] = Array(1, 2, 3)

Почему ++: и ++:=операторы дают разные результаты?Этот вид различий не отображается с оператором ++.

Используемая версия Scala - 2.11.8.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Здесь двоеточие (: ) означает, что функция имеет правильную ассоциативность

, поэтому, например, coll1 ++: coll2 похоже на (coll2).++:(coll1)

Что обычно означаетэлементы левой коллекции добавляются к правой коллекции

Дело-1:

Array(1,2) ++: Array(3)
Array(3).++:Array(1,2) 
Elements of the left array is prepended to the right array 
so the result would be Array(3,1,2)

Дело-2:

 r = Array(1,2)
 r ++:= Array(3) //This could also be written as the line of code below
 r = Array(3) ++: r
   = r. ++: Array(3)
   = Array(1,2). ++: Array(3) //Elements of the left array is prepended to the right array 
 so their result would be Array(1,2,3)

Надеюсь, что это решит вопрос Спасибо :)

0 голосов
/ 16 ноября 2018

Поскольку он заканчивается двоеточием, ++: является ассоциативным справа. Это означает, что Array(1, 2) ++: Array(3) эквивалентно Array(3).++:(Array(1, 2)). ++: можно рассматривать как «добавление элементов левого массива к правому массиву».

Так как это право-ассоциативно, r ++:= Array(3) desugars к r = Array(3) ++: r. Это имеет смысл, если учесть, что цель ++: предваряется. Это десагеринг справедливо для любого оператора, заканчивающегося двоеточием.

Если вы хотите добавить, вы можете использовать ++++=).

...