2012-03-24 10 views
5

Wenn Sie:Wie finden Sie rekursiv alle Module und Klassen innerhalb eines Moduls?

module A 
    class B 
    end 
end 

Sie B und ähnliche Klassen über A.constants finden. In Ruby 1.9.3 können Sie B jedoch nicht erhalten, wenn es sich in einem anderen Modul befindet. In Ruby 1.8.7 können Sie.

module A 
    module Aa 
    class B 
    end 
    end 
end 

Wie erhalten Sie B von der ersten Ebene von A? Was würde ich als Ausgang mag, ist eine Reihe von Konstanten, die alle Klassen wie B enthalten, aber irgendwo innerhalb des Moduls A.

+0

Was meinst du damit du B nicht bekommen kannst? Ich kann A :: Aa :: B.new machen, es funktioniert – megas

+0

Würde 'MyModule.constants.select {| c | Klasse === MyModule.const_get (c)} 'Arbeit für Sie? http://stackoverflow.com/questions/833125/find-classes-available-in-a-module – ScottJShea

+1

Ja, Sie können es direkt instanziieren. Aber wie würden Sie eine Reihe von Symbolen auffüllen, die Klassen wie B auflisten? Scott: Das wird nicht für Ruby 1.9.3 funktionieren (für Ruby 1.8.7). Konstanten enthalten aus irgendeinem Grund keine Module. – Jade

Antwort

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] 

Dieser Code wird brechen, wenn Sie Kreisnamensraum tun, auch bekannt als A::Aa::B.const_set(:A, A).

+0

Super, danke! – Jade

+1

cool. Vielen Dank! FYI. http://www.ruby-doc.org/core-2.0.0/Module.html#method-i-const_get – Juguang

+0

@Juguang scheint Ruby 2.0 zu sein. http://ruby-doc.org/core-1.9.3/Module.html#method-i-const_get – Reactormonk

Verwandte Themen