2009-08-07 14 views
21

Mam kilka pytań dotyczących metod, procedur i bloków Ruby, które wydają mi się dość dziwne. Nie tyle chodzi o składnię, czy funkcję, co logika podejmowanych decyzji.Metoda Rubiego, Proc i pomieszanie bloków

Pytanie 1:

Dlaczego jest to, że bloki mogą być przekazywane do metody (np każda), ale nie można ich przypisać do zmiennej?

Wiem, że można je przekazać w procedurach, tj. p = Proc.new {...} (dostęp za pomocą &p), ale nie ma większego sensu, aby programista przechodził przez te środki.

Pytanie 2:

Dlaczego istnieje rozróżnienie pomiędzy metodami i procedurami?

Na przykład, mogę wykonać zadanie definiowania funkcji i wywołanie tej funkcji w dwóch następujących sposobów:

def square(x) 
    x**2 
end 

square(3) 
=> 9 

lub

square = lambda {|x| x**2} 
square.call(3) 
=> 9 

dlaczego różnicowanie? W Pythonie na przykład zarówno definiowanie funkcji w standardowy sposób jak i przez square = lambda x: x**2 wykonuje to samo zadanie tworzenia funkcji i przypisywania jej do square.

Odpowiedz

20

Pytanie 1: Bloki nie są obiektami, są strukturami składniowymi; dlatego nie można ich przypisać do zmiennej. To jest przywilej zarezerwowany dla obiektów.

Pytanie 2: Metody nie są obiektami, więc nie mogą odbierać wiadomości. Odwrotnie, procs i lambdas są obiektami, więc nie można ich wywoływać jak metod, ale musi otrzymać komunikat, który nakazuje im zwrócić wartość na podstawie parametrów przekazanych wraz z wiadomością.

Procesory i lambdy są obiektami, dzięki czemu mogą odbierać wiadomości call i być przypisane do nazw. Podsumowując, jest to obiekt, który sprawia, że ​​procy i lambdy zachowują się w sposób, który wydaje ci się dziwny. Metody i bloki nie są obiektami i nie dzielą tego zachowania.

+5

Ruby twierdzi, wszystko jest obiektem. Bloki powinny być obiektami, aby się do nich dopasować, i mogą być przekazywane jako argumenty, więc z pewnością zachowują się jak obiekty w pewien sposób. – rpjohnst

+6

Bloki mogą być wykonane tak, aby działały jak obiekty poprzez tworzenie obiektów do ich reprezentowania, proc lub lambda. Bez tego urządzenia są tylko strukturami składniowymi. – Pinochle

+0

Są obiekty blokowe - taki jest cel lambda {cokolwiek}. – Chuck

4

Metody to metody - to znaczy działania, które obiekt może podjąć w odpowiedzi na wiadomości. Nie są funkcjami.

Bloki są zamknięciami - są to funkcje zbliżone do otaczającego zakresu. Nie koncepcyjnie "należą do" danego obiektu.

W niektórych językach metody są po prostu funkcjami, które są członkami obiektu, ale Ruby nie postrzega ich w ten sposób. Oddzielenie metody od jej własnego obiektu jest bardziej zbliżone do operacji niż proste przypisanie. Ruby bierze swój model orientacji obiektowej od Smalltalk, dziadka współczesnego OO.

5

Do pewnego stopnia przynajmniej, metody obiekty:

class ABC 
    def some_method 
    end 
end 
ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method> 

następstwie, że jest wbudowany w klasie: Metoda, jak udokumentowano here.

Patrz również poniżej: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

przypadkowo <bseg>, to raczej nie wydaje się potwierdzać ten wszystko-is-an-przedmiot rzecz. W tym konkretnym przypadku wydaje się, że wystarczy trochę więcej kopania, aby zobaczyć.

(I naprawdę musi dołożyć starań, aby to zrozumieć lepiej: Zaczynam myśleć, że to fundamentalne znaczenie dla coraz głębszego zrozumienia.)

+0

Metody wydają się brać ich obiektowość jako instancji 'Proc'. W dokumentacji 'ri' dla' Metody' słowo "metoda" nie jest używane w wyjaśnieniu, ale "proc" jest. Dwie klasy otrzymują te same wiadomości, ale różnica polega na tym, w jaki sposób są one wywoływane oraz na tym, że metody są zdefiniowane w przestrzeni nazw innego obiektu, gdzie procy muszą otrzymać metodę "wywołania", która ma zostać wywołana i istnieć (Powiedziałem wcześniej) niezależnie od innych obiektów. – Pinochle

+0

Ahh, kolejna różnica ... 'Metoda' nie otrzymuje wiadomości' new', gdzie 'Proc' ma. Jeśli metody są obiektami, nie są obiektami w pełnym znaczeniu ("pełne" znaczenie ma wszystkie cechy, których jesteśmy przyzwyczajeni w obiektach). – Pinochle

+0

Ten link do wikibooków jest pomocny. Dzięki. – David