2009-05-07 20 views
57

Tengo un módulo MyModule. Cargo dinámicamente clases en él. ¿Cómo puedo obtener una lista de las clases definidas dentro de su espacio de nombres?Buscar clases disponibles en un Módulo

Ejemplo:

def load_plugins 
    Dir.glob(File.dirname(__FILE__) + '/plugins/*.rb') do |f| 
    MyModule.class_eval File.read(f) 
    end 

    # now how can I find the new classes I've loaded into MyModule? 
end 

debería decir que cada f contiene algo así como "la clase Foo; final".

También puede pensarlo así: en Rails, ¿cómo podría encontrar programáticamente todas las clases definidas dentro del módulo ActiveRecord?

Respuesta

98

Se accede a las clases a través de constantes. Las clases definidas dentro de un módulo se enumeran como constantes en ese módulo. Entonces solo necesita elegir las constantes que se refieren a las clases.

MyModule.constants.select {|c| MyModule.const_get(c).is_a? Class} 
+1

Impresionante. Gracias. – joshuaxls

+7

Una cosa: ¿por qué usa esa prueba en lugar de "MyModule.const_get (c) .is_a? Class"? No estoy familiarizado con el uso de "===" así. – joshuaxls

+3

Sin razón convincente. La versión === fue más fácil de leer para mí. ¿Usando is_a? funcionaría igual de bien. – Chuck

Cuestiones relacionadas