2009-06-19 19 views
38

Sono sicuro che c'è una risposta semplice per questo; Non riesco proprio a trovarlo. Feci una funzione nidificata in rubino, e avevo difficoltà a variabili dalla funzione esterna all'interno della funzione interna:Ruby che accede a variabili esterne nella funzione nidificata

def foo(x) 
    def bar 
    puts x 
    end 
    bar 
    42 
end 

foo(5) 

ottengo: NameError: undefined local variable or method x' per principale: Object`

Il codice Python analogo funziona:

def foo(x): 
    def bar(): 
    print x 
    bar() 
    return 42 

foo(5) 

Quindi, come faccio a fare la stessa cosa in Ruby?

+9

Un importante (ma sottili) distinzione è che def ... fine definisce un metodo, non una funzione. usa lambda/proc per definire le funzioni e catturare le variabili locali in una chiusura, come mostra Tadman. – rampion

risposta

44

Per quanto ne so, la definizione di una funzione con nome all'interno di una funzione non consente di accedere a nessuna variabile locale.

Che cosa si può fare, invece è usare un Proc:

def foo(x) 
    bar = lambda do 
    puts x 
    end 
    bar.call 
    42 
end 

foo(5) 
Problemi correlati