2009-06-19 10 views
38

Jestem pewien, że istnieje prosta odpowiedź; Po prostu nie mogę tego znaleźć. Zrobiłem zagnieżdżonych funkcji w Ruby i miałem problemy z uzyskaniem dostępu do zmiennych z funkcji zewnętrznej wewnątrz wewnętrznej funkcji:Ruby uzyskujące dostęp do zmiennych zewnętrznych w funkcji zagnieżdżonej

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

foo(5) 

uzyskać: NameError: undefined local variable or method x”za główny: Object`

Analogiczny kod Python działa:

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

foo(5) 

Jak mam zrobić to samo w Ruby?

+9

Ważnym (ale subtelny) różnica jest taka, że ​​def ... koniec definiuje metody, nie jest funkcją. użyj lambda/proc do zdefiniowania funkcji i przechwytywania zmiennych lokalnych w zamknięciu, jak pokazuje tadman. – rampion

Odpowiedz

44

O ile mi wiadomo, zdefiniowanie nazwanej funkcji w ramach funkcji nie daje dostępu do żadnych zmiennych lokalnych.

Co można zrobić, to zamiast używać Proc:

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

foo(5) 
Powiązane problemy