2012-11-13 3 views
10

私はこのようなオブジェクトに名前を付けることができますが、mを呼び出すことはできません。オブジェクト+を使ったScalaの中置表記は、どうしてですか?

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

+.m("hi")を呼び出すことはできません:

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

も(DSL-の使用に好適)+ m "hi"を呼び出すことはできません。

しかし、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

私は信じている問題があることなしで単項演算子を処理するために、あいまいさは、特殊ケースに依存します。!,+-、およびは単項演算子として扱われます。したがって、+.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

関連する問題