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 依赖于一种特殊情况:只有!, +,-~被视为一元运算符。因此,在 中+.m("hi"),scala 将+其视为一元运算符,无法理解整个表达式。

于 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 回答