嵌套递归函数的 Scala 前向引用
Scala forward reference of nested recursive function
我有一个带有嵌套递归函数的非常简单的方法定义:
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 中,一切正常
你可以把它变成 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)
}
当你
put the val foo: ... = ... line by itself, and not nested within a def
变成了字段和getter方法的组合,而foo(i-1)
实际上调用的是getter方法,而不是引用value 你在定义,这是非法的;但是当你在一个方法中有一个 val
时,它只是一个局部变量并且没有 getter 方法。
我有一个带有嵌套递归函数的非常简单的方法定义:
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 中,一切正常
你可以把它变成 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)
}
当你
put the val foo: ... = ... line by itself, and not nested within a def
变成了字段和getter方法的组合,而foo(i-1)
实际上调用的是getter方法,而不是引用value 你在定义,这是非法的;但是当你在一个方法中有一个 val
时,它只是一个局部变量并且没有 getter 方法。