2012-02-01 8 views

Odpowiedz

11

Dzieje się tak dlatego, że metody Rubiego nie są obiektami pierwszej klasy (tak jak na przykład w przypadku IO). Więc kiedy definiujesz wewnętrzną metodę, jaki jest odbiornik? Prawdopodobnie sama metoda, lub wiążące lub coś, ale Ruby nie ma tak głębokiej OO.

W każdym razie nie jest dla mnie jasne, czego się spodziewałeś w swoim przykładzie, czy chciałeś, żeby zmodyfikował lokalny varialbe a? Jeśli tak, proc jest odpowiednim substytutem metody.

def test 
    a = "a is for apple" 
    inner_method = lambda do 
    a = "something" 
    end 

    a # => "a is for apple" 
    inner_method.call 
    a # => "something" 
end 

test 

functional.rb” jest bardziej ekstrawaganckie przykładem tego stylu programowania.

A "lambda, proc, and Proc.new" to zestawienie różnych typów zamknięć Rubiego.

+0

Po prostu wydaje się nie na miejscu, gdy wszystko inne ma zakres leksykalny. –

+5

"Cała reszta"? Z wyjątkiem bloków, * nic * ma zasięg leksykalny. Nie ciał metod. Nie ciała klasowe. Nie ciała modułów. Nie ciała skryptowe. * Bloki * to te, które są "nie na miejscu". –

+3

Metody Scali nie są pierwszorzędnymi obiektami, ale wewnętrzne metody zbliżają się do otoczenia otaczających ich metod. Istnieje znacznie prostszy powód, dla którego "metoda wewnętrzna" nie zamyka się na jej zewnętrznej metodzie: ponieważ * nie jest * "metodą wewnętrzną". Jest to definicja metody globalnej. –

Powiązane problemy