为什么Scala语言中的++:运算符如此奇怪?

时间:2018-11-16 06:09:10

标签: arrays scala collections assignment-operator

我正在使用++:运算符来获取两个集合的集合,但是使用这两种方法获得的结果不一致:

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 :(得分:6)

++:由于以冒号结尾,因此是右关联的。这意味着Array(1, 2) ++: Array(3)等效于Array(3).++:(Array(1, 2))++:可以被认为是“将左侧数组的元素添加到右侧数组。”

由于它是右关联的,因此r ++:= Array(3)r = Array(3) ++: r的替代性降低。当您认为++:的目的是前提时,这是有道理的。对于任何以冒号结尾的运算符,这种减法都是适用的。

如果要追加,可以使用++(和++=)。

答案 1 :(得分:1)

此处冒号()表示该函数具有正确的关联性

因此,例如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)

希望这可以解决查询 谢谢:)