“递归方法<方法名称=”“>需要在Scala中输入”是什么意思?</method>

时间:2010-09-01 12:11:52

标签: scala

当我尝试从方法调用中省略点时,例如在此示例程序中:

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,则以某种奇怪的方式修复第一个错误。在bazbar之间放置一个点之前,第二个不会消失。这是什么原因?为什么Scala认为baz bar是一种递归方法?

1 个答案:

答案 0 :(得分:7)

你看到的问题是,如果你省略了代码是不明显的点。编译器会将表达式视为

var foo = baz.bar(println(foo))

因此foo是递归定义的,StringOps.apply方法需要Int参数(String将隐式转换为StringOps,因为String具有apply没有Unit方法。

在调用带有一个非{{1}}参数的方法时,你应该只使用类似于运算符的语法来避免这种歧义。