2017-04-05 144 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的答案中所述)。