2013-03-18 13 views
5

edelim açık sınıf Module ve buna bir yöntemini ekleyin: Bunu yaparak bu yöntemi çağırabilirsinizSınıf, Modül, onların eigenclasses ve yöntem arama

class Module 
    def foo 
    puts "phew" 
    end 
end 

,

Class.foo 

anlaşılabilir Çünkü Class sınıfı, üst sınıfı Module olan Class10'dur. böylece Module'da tanımlanan örnek yöntemlerini çağırabilir.

relation between classes and modules

Şimdi, yöntem aşağıda barModule 'ın eigenclass tanımlanır:

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

ama şimdi

Class.bar 

da çalışır.

Birisi bana Module adlı kişinin eigenclass yöntemindeki yöntemlere nasıl erişebileceğini açıklayabilir mi?


Sanırım şimdi anladım. Metot bak, daha önce açıkladığım şekilde çalışmıyor. Class.foo yaptığımda, yöntem Class 's eigenclass içinde aranır ve daha sonra Module' in eigenclass olan BasicObject 's eigenclass kadar kendi noktası (kendi kuyruğunu yediği bir yılan gibi) kendi başına dönecek şekilde eigenclass Class yönteminde (Class, BasicObject'un eigenclass'ın üst sınıfıdır) ve daha sonra, yöntemi bulduğu üst sınıf Module.

Benzer şekilde, Class.bar yaptığımda, yöntem Class adlı kişinin eigenclass'ında ve daha sonra Module'un bulduğu eigenclass içinde aranır.

Ben

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

ve

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

tahminim wot yaptığınızda yaptığımda çıktısı:

Class.check 

Bu benim şimdiki anlayış: current understanding

+0

İlgili tartışma Yararlı oldu: https: // stackoverflow.com/questions/13269271/why-a-modules-singleton-method-in-not-in-not-akım-eigenclasses-nerede –

cevap

0

Son zamanlarda yeni Ruby 2.0 davranışı dahil olmak üzere güzel bir extensive tutorial yazdım.

Not: Ruby'de kullanılan terim, eigenclass değil, singleton_class'dir.

+0

Bu URL'deki bağlantı öldü –

1

Eigenclasses, this blog post by Andrea Singh'da yer aldığında, Ruby'nin yöntem arama davranışına ilişkin oldukça kapsamlı bir genel bakış vardır. Özellikle, "Eigenclasses ve Class Inheritance" bölümünün sonuncusu, sorularınızı ele alması gereken kullanışlı bir arama şemasını içerir.

+0

Bu mevcut Ruby 2.2 olarak mı? –

İlgili konular