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

Why is the ++: operator in the Scala language so strange?

提问人:xuejianbest 提问时间:11/16/2018 最后编辑:Brian McCutchonxuejianbest 更新时间:11/16/2018 访问量:304

问:

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

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。

数组 scala 集合 assignment-operator

评论

0赞 Thilo 11/16/2018
和 的另一个有趣的效果是,它从右侧获取结果集合的类型(如果它们不是两个数组,如此处所示,stackoverflow.com/a/24338494/14955)---在存在 的情况下对“右手”进行某种定义。++:++:=++:=

答:

6赞 Brian McCutchon 11/16/2018 #1

由于它以冒号结尾,因此是右联想的。这意味着这等价于 。 可以认为是“将左边数组的元素置到右边的数组前面”。++:Array(1, 2) ++: Array(3)Array(3).++:(Array(1, 2))++:

由于它是右关联的,因此脱糖为 .当您认为 的目的是预置时,这是有道理的。这种脱糖适用于任何以冒号结尾的操作员。r ++:= Array(3)r = Array(3) ++: r++:

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

评论

4赞 Brian McCutchon 11/16/2018
@Thilo +:::和 ::: 浮现在脑海中。同样,它是以冒号结尾的任何东西。
2赞 Jörg W Mittag 11/16/2018
@Thilo:Scala 中没有“运算符”这样的东西。任何方法都可以在没有句点的情况下调用,例如: ,当您只传递一个参数时,您可以省略括号,如下所示: .就是这样。它只是一个普通的方法调用,只是一个普通的方法名称,如 .不过,有两个例外,这意味着 Scala 实际上确实有“半运算符”。1) 优先级由方法名称的第一个字符确定。2) 以 a 结尾的方法在使用运算符语法调用时是右关联的。a foo(bar, baz)a foo bar++foo:
2赞 Jörg W Mittag 11/16/2018
注意:这也适用于类型构造函数。所以,如果你有,那么你当然可以说,但你也可以说,如果你有,那么和是一样的。class Foo[A, B] {}def foo: Foo[Int, String]def foo: Int Foo Stringclass Foo_:[A, B]Foo_:[Int, String]String Foo_: Int
1赞 Jörg W Mittag 11/16/2018
啊,对不起。我的错。 是一元的,而不是二进制的。但可能有人正在这样做。::
1赞 Brian McCutchon 11/17/2018
@JörgWMittag 类型构造函数可以是右关联的(就是一个例子),但在这种情况下,它们不会交换参数的顺序(谢天谢地)。shapeless.::
0赞 prasanna kumar 11/16/2018 #2

这里 colon() 表示该函数具有正确的关联性

因此,例如类似于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赞 Brian McCutchon 11/16/2018
++:是一个方法,而不是一个函数。