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 внутри метода это просто локальная переменная и не имеет метода получения.

Другие вопросы по тегам