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