当我尝试从方法调用中省略点时,例如在此示例程序中:
object Test extends Application {
val baz = new Baz
var foo = baz bar
println(foo)
}
class Baz {
def bar = "bar"
}
我得到了奇怪的错误。第一个是error: recursive method foo needs type: println foo
,另一个是error: type mismatch; found: Unit, required: Int, println(foo)
。如果我指定foo
的类型应该是String,则以某种奇怪的方式修复第一个错误。在baz
和bar
之间放置一个点之前,第二个不会消失。这是什么原因?为什么Scala认为baz bar
是一种递归方法?
答案 0 :(得分:7)
你看到的问题是,如果你省略了代码是不明显的点。编译器会将表达式视为
var foo = baz.bar(println(foo))
因此foo
是递归定义的,StringOps.apply
方法需要Int
参数(String
将隐式转换为StringOps
,因为String
具有apply
没有Unit
方法。
在调用带有一个非{{1}}参数的方法时,你应该只使用类似于运算符的语法来避免这种歧义。