Scala 什么是;递归方法<;方法名称>;“需要类型”;用斯卡拉的话是什么意思?
当我尝试从方法调用中省略点时,如下面的示例程序:Scala 什么是;递归方法<;方法名称>;“需要类型”;用斯卡拉的话是什么意思?,scala,Scala,当我尝试从方法调用中省略点时,如下面的示例程序: object Test extends Application { val baz = new Baz var foo = baz bar println(foo) } class Baz { def bar = "bar" } 我会犯奇怪的错误。第一个是错误:递归方法foo需要类型:println foo,另一个是错误:类型不匹配;找到:单位,必需:Int,println(foo)。如果我指定foo的类型应该是String,
object Test extends Application {
val baz = new Baz
var foo = baz bar
println(foo)
}
class Baz {
def bar = "bar"
}
我会犯奇怪的错误。第一个是
错误:递归方法foo需要类型:println foo
,另一个是错误:类型不匹配;找到:单位,必需:Int,println(foo)
。如果我指定foo
的类型应该是String,那么第一个错误以某种奇怪的方式得到了修复。在我把一个点放在baz
和bar
之间之前,第二个不会消失。这是什么原因?为什么Scala认为baz bar是一种递归方法?您看到的问题是,如果忽略点,代码是模糊的。编译器将把表达式视为
var foo = baz.bar(println(foo))
因此,foo
是递归定义的,并且StringOps.apply
方法需要一个Int
参数(String
将被隐式转换为StringOps
,因为String
没有apply
方法)
调用采用一个非
单元的方法时,应仅使用类似运算符的语法,以避免此类歧义。非常感谢您的回答。我不知道Scala会这样把线拼在一起。我以为它把换行符当作分号。我做了一些实验,这个问题也可以通过在val foo=baz bar
之后插入分号来解决。Scala通常将换行符视为空白,但编译器会在需要时尝试推断分号。在您的情况下,这与类型推断无法很好地配合使用。类似: