以下是以下問題。當我運行以下命令:組合名稱爲冒號的操作符和空間異性
object Test {
def /:(s: => Unit) = {
println("/:")
s
}
}
println("A") /: Test
它打印:
A
/:
不過,我期待它打印:
/:
A
自上次表達假想改寫Test./:(println("A"))
- 它通過方式,給第二個價值。
有沒有人知道如何使第一種語法工作,例如println("A") /: Test
,但與名稱?
編輯
使用desugar方法,我發現該調用不同脫。
> desugar { println("A") /: Test}
val x$1: Unit = println("A");
Test./:(x$1)
因此,我仍然想知道爲什麼這個選擇。
爲什麼你「假設」表達式等同於'Test ./ :(:(println(「A」))'?該規範說:「左聯合二進制操作'e1 op e2'被解釋爲'e1.op(e2)',如果op是右聯合的,則相同的操作被解釋爲'{val x = e1; e2.op(x)}',其中'x'是一個新名字。「所以,它相當於'{val x = println(「A」); Test./:(x)}'。 –