嵌套递归函数的Scala前向引用

时间:2015-08-02 02:53:25

标签: scala recursion forward-reference

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

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中,一切正常

1 个答案:

答案 0 :(得分: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方法。