2012-03-24 18 views
5

Eğer varsa:Modül içindeki tüm modülleri ve sınıfları tekrarlı olarak nasıl buluyorsunuz?

module A 
    class B 
    end 
end 

Sen A.constants yoluyla B ve benzeri sınıfları bulabilirsiniz. Ancak, Ruby 1.9.3'te, başka bir modülde ise B'yi alamazsınız. Ruby 1.8.7'de yapabilirsiniz.

module A 
    module Aa 
    class B 
    end 
    end 
end 

nasıl bir ilk seviyesinden B alabilirim? Ne çıktı olarak istiyorum B gibi tüm sınıfları dahil sabitleri, bir dizi, ancak dairesel ad alanları var ise her yerde modül A dahilinde

+0

Ne demek B'yi alamıyorsunuz? Ben A :: Aa :: B.new yapabiliriz, – megas

+0

çalışır mı? MyModule.constants.select {| c | Class === MyModule.const_get (c)} 'sizin için çalışıyor mu? http://stackoverflow.com/questions/833125/find-classes-available-in-a-module – ScottJShea

+1

Evet, doğrudan bunu başlatabilirsiniz. Ama B gibi sınıfları listeleyen bir dizi sembolü nasıl doldurursunuz? Scott: Bu Ruby 1.9.3 için çalışmayacak (Ruby 1.8.7 için). Sabitler, bazı nedenlerle modüller içermez. – Jade

cevap

12
class Module 
    def all_the_modules 
    [self] + constants.map {|const| const_get(const) } 
     .select {|const| const.is_a? Module } 
     .flat_map {|const| const.all_the_modules } 
    end 
end 

A.all_the_modules 
# => [A, A::Aa, A::Aa::B] 

Bu kod aka A::Aa::B.const_set(:A, A) kıracak.

+0

Harika, teşekkürler! – Jade

+1

havalı. Teşekkürler! Bilginize. http://www.ruby-doc.org/core-2.0.0/Module.html#method-i-const_get – Juguang

+0

@Juguang Ruby 2.0 olarak görünüyor. http://ruby-doc.org/core-1.9.3/Module.html#method-i-const_get – Reactormonk

İlgili konular