2012-03-24 15 views
5

Si usted tiene:¿Cómo se encuentran todos los módulos y clases dentro de un módulo, recursivamente?

module A 
    class B 
    end 
end 

puede encontrar clases B y similares a través de A.constants. Sin embargo, en Ruby 1.9.3, no puede obtener B si está dentro de otro módulo. En Ruby 1.8.7 puedes.

module A 
    module Aa 
    class B 
    end 
    end 
end 

¿Cómo se obtiene B del primer nivel de A? Lo que me gustaría que la salida es una matriz de constantes, que incluyen todas las clases como B, pero en cualquier lugar dentro del módulo A.

+0

¿Qué quieres decir con que no puedes obtener B? Puedo hacer A :: Aa :: B.nuevo, funciona – megas

+0

Podría 'MyModule.constants.select {| c | Clase === MyModule.const_get (c)} '¿funciona para usted? http://stackoverflow.com/questions/833125/find-classes-available-in-a-module – ScottJShea

+1

Sí, puede crear una instancia directamente. Pero, ¿cómo llenarías una serie de símbolos, que incluyen clases como B? Scott: eso no funcionará para Ruby 1.9.3 (sería para Ruby 1.8.7). Las constantes no incluyen módulos por alguna razón. – Jade

Respuesta

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] 

Este código se romperá si tienen espacios de nombres circulares, también conocido como A::Aa::B.const_set(:A, A).

+0

¡Impresionante, gracias! – Jade

+1

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

+0

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

Cuestiones relacionadas