2010-11-10 35 views
9

ja skaczę na szynach programowania po raz pierwszy i, patrząc na kod dla niektórych bibliotek Pobrałem, ja od czasu do czasu zauważyć kod:Czy ktoś może mi wyjaśnić klasę << jaźń?

class << self 
    def func 
    stuff 
    end 
end 

Próbowałem wyszukać w internecie o wyjaśnienie , ale < < zostaje usunięty z najbardziej przydatnych wyszukiwarek, więc kończy się poszukiwaniem klasy, co nie jest zbyt użyteczne. Każdy wgląd byłby doceniony.

+2

jest Google nie przydatnym wyszukiwarka? http://www.google.com/search?source=ig&hl=pl&rlz=&=&q=klasa+%3C%3C+self&btnG=Google+Search – McKay

+0

@McKay: oprócz http://forums.pragprog.com/forums/77/topics/657, co nie było takie samo jak to, co robił Wade, które trafienia były istotne dla pytania Wade'a? –

+0

Pierwsze dwa trafienia są istotne (trzeci prawdopodobnie). Drugi link (http://www.thekode.net/blog/blog.html) mówi o tym idiomie i linki: http://www.thekode.net/ruby/techniques/DefiningMethodsWithClosures.html, które mogą być również Wsparcie. – McKay

Odpowiedz

12

W języku Ruby, class << foo otwiera singleton class obiektu, do którego odwołuje się foo. W Ruby każdy obiekt ma przypisaną pojedynczą klasę, która ma tylko jedną instancję. Ta klasa singleton zachowuje specyficzne dla obiektu zachowanie, tj. Metody singleton.

Tak więc, class << self otwiera singleton klasy self. To, co dokładnie jest self, to, w zależności od kontekstu, w którym się znajdujesz. W treści definicji modułu lub klasy jest to na przykład sam moduł lub klasa.

Jeśli dla wszystkich używasz klasy singleton, definiując metody singleton, istnieje na to skrót: def foo.bar.

Oto przykład jak użyć metody singleton, aby zapewnić pewne „procedury”, które tak naprawdę nie mają żadnego powiązania z konkretnym przypadku:

class << (Util = Object.new) 
    def do_something(n) 
    # ... 
    end 
end 

Util.do_something(n) 
+0

Więc to w zasadzie sposób, w jaki Ruby radzi sobie z metodą statyczną w języku takim jak Java? Czy są jakieś różnice? –

+0

@Wade - część def jest jak statyczna metoda, tak. Ale możesz manipulować zmiennymi na poziomie klasy wewnątrz otwartego bloku << end i wykonywać tam także inne dynamiczne rzeczy. Definicje klas Ruby są wykonywane, nie są statycznie odczytywane. Na przykład można tam uruchomić inne metody na poziomie klasy i zdefiniować tam inne klasy. –

2

To odpowiednik

def self.func 
    stuff 
end 

tą różnicą, że wszystkie metody są zagnieżdżone w nim metody klasy. To pozwala zadeklarować kilka metod metod klasowych, bez przekłamywania każdego z nich na self.

+0

To jest dobre dla więcej niż tylko metod klasowych. – Chuck

+0

To prawda, ale tak jest w powszechnym przypadku. –

Powiązane problemy