2012-11-13 50 views
10

我可以說出這樣的對象,但不能調用m斯卡拉的中綴表示法與對象+,爲什麼不可能?

object + { 
    def m (s: String) = println(s) 
} 

不能調用+.m("hi")

<console>:1: error: illegal start of simple expression 
     +.m("hi") 

也不能打電話+ m "hi"(首選DSL使用率)。

但與object ++它工作正常!他們是否與(不存在)unary_+方法衝突?可以避免這種情況嗎?

+1

不幸的是,我沒有在你爲什麼什麼比猜測更好不能使用+,但可以使用'$ plus.m(「hi」)' – Austin

回答

11

事實上,一元運算符是不可能的。如果你想反正調用它,你可以求助於使用編譯器的JVM(與美元開始)所產生的名字:

scala> object + { 
    | def m(s: String) = println(s) 
    | } 
defined module $plus 

scala> +.m("hello") 
<console>:1: error: illegal start of simple expression 
     +.m("hello") 
     ^

scala> $plus.m("hello") 
hello 
6

我相信問題是,爲了處理一元運算符不模棱兩可,scala依賴於一個特例:只有!,+,-~被視爲一元運算符。因此在+.m("hi")中,scala把+當作一元運算符,並且不能理解整個表達式。

1

另一個代碼中使用包:

object Operator extends App { 
    // http://stackoverflow.com/questions/13367122/scalas-infix-notation-with-object-why-not-possible 
    pkg1.Sample.f 
    pkg2.Sample.f 
} 

package pkg1 { 
    object + { 
     def m (s: String) = println(s) 
    } 

    object Sample { 
     def f = { 
      // +.m("hi") => compile error: illegal start of simple expression 
      // + m "hi" => compile error: expected but string literal found. 
      $plus.m("hi pkg1") 
      $plus m "hi pkg1" 
     } 
    } 
} 

package pkg2 { 
    object + { 
     def m (s: String) = println(s) 
    } 

    object Sample { 
     def f = { 
      pkg2.+.m("hi pkg2") 
      pkg2.+ m "hi pkg2" 
      pkg2.$plus.m("hi pkg2") 
      pkg2.$plus m "hi pkg2" 
     } 
    } 
} 

Java版本 「1.7.0_09」

Scala代碼亞軍版本2.9.2