2013-03-18 16 views
5

Otwórzmy klasa Module i dodać metodę do niego:klasa, moduł, ich eigenclasses oraz metody lookup

class Module 
    def foo 
    puts "phew" 
    end 
end 

mogę wywołać tę metodę w ten sposób,

Class.foo 

co jest zrozumiałe ponieważ klasa Class to Class, której nadklasa to Module. więc może wywoływać metody instancji zdefiniowane w Module.

relation between classes and modules

Teraz metoda bar poniżej określono na eigenclass Module „s:

class Module 
    def self.bar 
    puts "bar" 
    end 
end 

ale teraz

Class.bar 

również działa.

Czy ktoś może mi wyjaśnić, w jaki sposób Class może uzyskać dostęp do metod w eigenclass Module?


Myślę, że mam to teraz. Wyszukiwanie metod nie działa w sposób opisany wcześniej. kiedy robię Class.foo, metoda jest przeszukiwana w Class 's eigenclass, a następnie jest superklasą, która jest Module' s eigenclass całą drogę aż do BasicObject 's eigenclass w którym momencie się zwraca (jak wąż jedząc własny ogon), aby wyglądać dla metody w Class (jako Class jest nadklasą z eigenclass BasicObject), a następnie do jej nadklasy Module, gdzie znajduje metodę.

Podobnie, kiedy nie Class.bar, sposób poszukuje się Class jest eigenclass, a następnie w Module 's eigenclass w którym się ona znajduje.

Kiedy zrobić

class Class 
    def check 
    puts "class instance method" 
    end 
end 

i

class Module 
    def self.check  
    puts "modules eigenclass method"  
    end  
    def check  
    puts "module instance method" 
    end  
end 

domysły wot jest wyjście, gdy zrobić:

Class.check 

To jest moje obecne rozumienie: current understanding

+0

Powiązana dyskusja Znalazłem pomocny: https: // stackoverflow.com/questions/13269271/why-a-modules-singleton-method-is-not-visible-in-downstream-eigenclasses-where –

Odpowiedz

0

Ostatnio napisałem piękne extensive tutorial, w tym nowe zachowanie Ruby 2.0.

Uwaga: termin używany w Ruby to singleton_class, a nie eigenclass.

+0

Link pod tym adresem URL jest martwy –

1

Istnieje dość obszerny przegląd sposobu wyszukiwania metody Rubiego, gdy Atomy są zaangażowane w this blog post by Andrea Singh. Warto zauważyć, że sekcja "Eigenclasses and Class Inheritance" na samym końcu zawiera użyteczny diagram, który powinien odpowiedzieć na twoje pytania.

+0

Czy to jest aktualne od Ruby 2.2? –

Powiązane problemy