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_+メソッドと競合しますか?これを回避することは可能ですか?

4

3 に答える 3

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
于 2012-11-13T19:16:31.977 に答える
6

問題は、単項演算子をあいまいさなく処理するために、scalaが特殊なケースに依存していることだと思います。、、、だけが単項!演算子として扱われます。したがって、では、scalaは単項演算子として扱い、式全体を理解することはできません。+-~+.m("hi")+

于 2012-11-13T19:25:35.707 に答える
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

于 2012-11-14T05:10:31.527 に答える