提问人:xuejianbest 提问时间:11/16/2018 最后编辑:Brian McCutchonxuejianbest 更新时间:11/16/2018 访问量:304
为什么 Scala 语言中的 ++: 运算符如此奇怪?
Why is the ++: operator in the Scala language so strange?
问:
我正在使用运算符来获取两个集合的集合,但是我使用这两种方法得到的结果不一致:++:
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。
答:
6赞
Brian McCutchon
11/16/2018
#1
由于它以冒号结尾,因此是右联想的。这意味着这等价于 。 可以认为是“将左边数组的元素置到右边的数组前面”。++:
Array(1, 2) ++: Array(3)
Array(3).++:(Array(1, 2))
++:
由于它是右关联的,因此脱糖为 .当您认为 的目的是预置时,这是有道理的。这种脱糖适用于任何以冒号结尾的操作员。r ++:= Array(3)
r = Array(3) ++: r
++:
如果要追加,可以使用 (和 )。++
++=
评论
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 String
class 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
++:
是一个方法,而不是一个函数。
评论
++:
++:=
++:=