2015-08-02 8 views
3

У меня есть это действительно простое определение метода с вложенной рекурсивной функции: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, все работает

+0

Почему бы вам не сделать это? – Jus12

ответ

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) 
} 

Когда вы

put the val foo: ... = ... line by itself, and not nested within a def

становится сочетание поля и метод получения и foo(i-1) фактически вызывает метод получения вместо ссылки на значение вы определяете, что является незаконным; но когда у вас есть val внутри метода, это всего лишь локальная переменная и не имеет метода getter.

+0

Итак, почему doesnt val = ... работает внутри метода? –