我可以命名这样的对象,但不能调用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)
我认为,问题是,为了处理一元运算符毫不含糊,斯卡拉依赖于一个特殊情况:仅!,+,-和~被视为一元运算符.因此,在+.m("hi")scala 中,scala被+视为一元运算符,无法理解整个表达式.