我可以这样命名对象,但不能调用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_+
方法冲突?有可能避免这种情况吗?
我可以这样命名对象,但不能调用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_+
方法冲突?有可能避免这种情况吗?
实际上,一元运算符是不可能的。如果您仍然想调用它,您可以使用编译器为 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
我认为问题在于,为了不产生歧义地处理一元运算符,scala 依赖于一种特殊情况:只有!
, +
,-
和~
被视为一元运算符。因此,在 中+.m("hi")
,scala 将+
其视为一元运算符,无法理解整个表达式。
另一个使用包的代码:
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