2009-06-08 9 views
26

Szybkie pytanie dotyczące użycia "SELF" w module lub bibliotece. Zasadniczo, jaki jest zakres/kontekst "SELF", ponieważ odnosi się do modułu lub biblioteki i jak należy go właściwie używać? Na przykład o tym, co mówię, sprawdź moduł "AuthenticatedSystem" zainstalowany z "restful_authentication".(Ruby, Rails) Kontekst SELF w modułach i bibliotekach ...?

UWAGA: zdaję sobie sprawę, że "ja" oznacza "to" w innych językach i jak "ja" działa na klasę/obiekt, jednak w kontekście modułu/biblioteki nie ma nic do "ja" . Więc jaki jest kontekst jaźni wewnątrz czegoś takiego jak moduł, w którym nie ma klasy?

Odpowiedz

44

w module:

Kiedy widzisz self w metody instancji, to odnosi się do instancji klasa, w której moduł jest zawarty.

Po wyświetleniu self poza metodą instancji odnosi się do modułu.

module Foo 
    def a 
    puts "a: I am a #{self.class.name}" 
    end 

    def Foo.b 
    puts "b: I am a #{self.class.name}" 
    end 

    def self.c 
    puts "c: I am a #{self.class.name}" 
    end 
end 

class Bar 
    include Foo 

    def try_it 
    a 
    Foo.b # Bar.b undefined 
    Foo.C# Bar.c undefined 
    end 
end 

Bar.new.try_it 
#>> a: I am a Bar 
#>> b: I am a Module 
#>> c: I am a Module 
+1

Precyzyjnie. Wszystko jest obiektem w Ruby. Nie ma miejsca, gdzie można wykonać kod, w którym nie ma jaźni. – Chuck

+0

Zrozumiano, więc jaki jest zakres/cel wzywania siebie w module? –

+0

Witam wszystkich, Nadal szukam jednoznacznej odpowiedzi. Zdaję sobie sprawę, co może zrobić SELF *. Co muszę wiedzieć dokładnie to, co robi * robi * w funkcji modułu? Domyślam się, że jakiś typ zmiennej jest ustawiony globalnie, ale nie jestem pewien, czy tak jest. Czy ktoś może potwierdzić/oświecić? –

0

na krótkie podsumowanie ... http://paulbarry.com/articles/2008/04/17/the-rules-of-ruby-self

samo jest również używany do dodawania metod klasy (lub metod statycznych dla osób C#/Java). Poniższy urywek jest dodanie metody nazywanej do_something do bieżącego obiektu klasy (statyczny) ...

class MyClass 
    def self.do_something # class method 
     # something 
    end 
    def do_something_else # instance method 
    end 
end