2017-04-05 138 views
1

我可以合并两个列表如下起来:右联想与运营商:

List(1,2,3) ::: List(4,5,6) 

,其结果是:

res2: List[Int] = List(1, 2, 3, 4, 5, 6) 

操作:::是正确的关联,这是什么意思?

在数学,右结合是:

5 + (5 - (2 * 3)) 
+0

看看http://stackoverflow.com/questions/1162924/what-good-are-right-associative-methods-in-scala – Yaneeve

回答

2

右结合装置操作员(在我们的情况下,该方法:::),而使用左操作数作为参数在右操作数被应用。这意味着,实际的方法调用是这样完成的:

List(4,5,6).:::(List(1,2,3)) 

由于:::预规划名单,结果是List(1,2,3,4,5,6)

1

在最一般的意义上,right-associative意味着,如果你不把任何括号,它们将被认为是在右边:

a ::: b ::: c == a ::: (b ::: c) 

而左结合运营商(如+)将有

a + b + c == (a + b) + c 

然而,根据spec(6.12.3中缀行动)

左关联二进制运算e1 op e2被解释为e1.op(e2)。如果op是rightassociative,则 的相同操作被解释为{ val x=e1; e2.op(x) },其中 x是一个新名称。

因此,scala中的右关联运算符被视为右操作数的方法,其左操作数作为参数(如@yuval的答案中所述)。