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

xue*_*est 4 arrays collections scala 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)
Run Code Online (Sandbox Code Playgroud)

为什么++:++:=运营商会给出不同的结果?++操作员不会出现这种差异.

我使用的Scala版本是2.11.8.

Bri*_*hon 6

因为它以冒号结束,所以++:是右关联的.这意味着Array(1, 2) ++: Array(3)相当于Array(3).++:(Array(1, 2)).++:可以被认为是"将左数组的元素添加到正确的数组中".

既然它是正确联想的,那r ++:= Array(3)就是贬低r = Array(3) ++: r.当你考虑到++:前期的目的时,这是有道理的.对于任何以冒号结束的操作员来说,这种去除都是适用的.

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

  • @Thilo [`+:`](https://www.scala-lang.org/api/2.12.0/scala/collection/GenSeqLike.html#+ :( elem:A):scala.collection.GenSeq [A ]),[`::`](https://www.scala-lang.org/api/2.12.0/scala/collection/immutable/List.html# ::(x:A):列表[A] ),和[`:::`](https://www.scala-lang.org/api/2.12.0/scala/collection/immutable/List.html# :::(前缀:List [A]) :列表[A])浮现在脑海中.再一次,它是以冒号结束的任何东西. (4认同)
  • @Thilo:Scala中没有"运算符"这样的东西.任何方法都可以在没有这样的句子的情况下调用:`a foo(bar,baz)`,当你只传递一个参数时,你可以省略这样的括号:`a foo bar`.而已.它只是一个普通的方法调用,而```只是一个普通的方法名,比如`foo`.但是,有两个例外,这意味着Scala实际上*确实*拥有"半运算符".1)优先级由方法名称的第一个字符决定.2)以`:`结尾的方法在使用运算符语法调用时是右关联的. (2认同)
  • 注意:这也适用于类型构造函数.所以,如果你有'class Foo [A,B] {}`,那么你当然可以说'def foo:Foo [Int,String]`,但你也可以说`def foo:Int Foo String`,以及如果你有`class Foo _:[A,B]`,那么`Foo _:[Int,String]`和`String Foo_:Int`相同. (2认同)