3

我有一个带有嵌套递归函数的非常简单的方法定义:

def bar(arr : Array[Int]) : Int = {
  val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

但我得到这个错误:

<console>:36: error: forward reference extends over definition of value foo
     val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
                                                              ^

如果我只是单独放置 val foo: ... = ... 行,而不是嵌套在 def 中,那么一切正常

4

1 回答 1

5

您可以将其设为lazy val

def bar(arr : Array[Int]) : Int = {
  lazy val foo : Int => Int = (i: Int) => if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

def

def bar(arr : Array[Int]) : Int = {
  def foo(i: Int): Int = if(i == 0) 0 else i + foo(i-1)
  foo(3)
}

当你

单独放置 val foo: ... = ... 行,而不是嵌套在 def

它变成了一个字段和一个getter方法的组合,foo(i-1)实际上调用的是getter方法而不是引用你定义的值,这是非法的;但是当你有val一个方法时,它只是一个局部变量,没有getter方法。

于 2015-08-02T06:09:01.177 回答