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