Scala的中缀符号与对象+,为什么不可能?

时间:2012-11-13 19:09:37

标签: scala

我可以命名这样的对象,但无法调用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_+方法冲突吗?有可能避免这种情况吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

我认为问题在于,为了处理一元运算符而没有歧义,scala依赖于一个特例:只有!+-~是被视为一元运算符。因此,在+.m("hi")中,scala将+视为一元运算符,无法理解整个表达式。

答案 2 :(得分: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