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

The*_*ius 10 scala

我可以命名这样的对象,但不能调用m:

object + {
  def m (s: String) = println(s)
}
Run Code Online (Sandbox Code Playgroud)

不能打电话+.m("hi"):

<console>:1: error: illegal start of simple expression
       +.m("hi")
Run Code Online (Sandbox Code Playgroud)

也无法呼叫+ m "hi"(首选DSL使用).

object ++它工作正常!它们与(不存在)unary_+方法冲突吗?有可能避免这种情况吗?

par*_*tic 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
Run Code Online (Sandbox Code Playgroud)


Rég*_*les 6

我认为,问题是,为了处理一元运算符毫不含糊,斯卡拉依赖于一个特殊情况:仅!,+,-~被视为一元运算符.因此,在+.m("hi")scala 中,scala被+视为一元运算符,无法理解整个表达式.