2012-03-24 8 views
5

Se si dispone di:Come si trovano tutti i moduli e le classi all'interno di un modulo, in modo ricorsivo?

module A 
    class B 
    end 
end 

Potete trovare B e le classi simili via A.constants. Tuttavia, in Ruby 1.9.3, non è possibile ottenere B se si trova all'interno di un altro modulo. In Ruby 1.8.7 puoi.

module A 
    module Aa 
    class B 
    end 
    end 
end 

Come si ottiene B dal primo livello di A? Quello che vorrei come output è un array di costanti, che comprendono tutte le classi come B, ma ovunque all'interno del modulo A.

+0

Cosa vuoi dire che non puoi avere B? Posso creare A :: Aa :: B.new, funziona – megas

+0

'MyModule.constants.select {| c | Classe === MyModule.const_get (c)} 'funziona per te? http://stackoverflow.com/questions/833125/find-classes-available-in-a-module – ScottJShea

+1

Sì, è possibile creare un'istanza direttamente. Ma come si popolerebbe una serie di simboli, che elencano classi come B? Scott: non funzionerà per Ruby 1.9.3 (lo farebbe per Ruby 1.8.7). Le costanti non includono i moduli per qualche motivo. – Jade

risposta

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] 

Questo codice si romperà se si dispone di spazi dei nomi circolari, alias A::Aa::B.const_set(:A, A).

+0

Fantastico, grazie! – Jade

+1

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

+0

@Juguang Sembra essere rubino 2.0. http://ruby-doc.org/core-1.9.3/Module.html#method-i-const_get – Reactormonk

Problemi correlati