Scala прямая ссылка на вложенную рекурсивную функцию
У меня есть это действительно простое определение метода с вложенной рекурсивной функцией:
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 ответ
Вы можете сделать это 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
он становится комбинацией поля и метода получения, и foo(i-1)
фактически вызывает метод получения вместо ссылки на определяемое вами значение, что недопустимо; но когда у вас есть val
внутри метода это просто локальная переменная и не имеет метода получения.