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通常将换行符视为空白,但编译器会在需要时尝试推断分号。在您的情况下,这与类型推断无法很好地配合使用。类似: