2010-09-09 16 views

Respuesta

47
Foo.constants 

rendimientos constantes en todos los Foo. Esto incluye, pero no se limita a, nombres de clase. Si desea que sólo los nombres de las clases, puede utilizar

Foo.constants.select {|c| Foo.const_get(c).is_a? Class} 

si desea que los nombres de clases y módulos, se puede utilizar en lugar de is_a? Moduleis_a? Class.

+1

Esta es una gran respuesta. A veces olvida que las constantes en ruby ​​son cualquier cosa que comience con mayúscula, por lo que los nombres de las clases son instancias constantes de la clase de tipo. +1 –

+3

@jcaudle Ruby no * * clases de carga lenta. Estás pensando en Rails. – sepp2k

+5

Asegúrese de cargar todas las clases antes: 'Dir [" app/models/foo/*. Rb "]. Cada {| archivo | cargar archivo} ' – espinchi

30

Si, en lugar de los nombres de las constantes, que quieren que las clases mismas, podría hacerlo de esta manera:

Foo.constants.map(&Foo.method(:const_get)).grep(Class) 
+4

I * love * programación sin puntos. ¿Se está mostrando mi Haskell? –

+1

¡Te compraré una cerveza para esta respuesta! –

+1

¿Qué hace &? – shredding

10

Esto sólo devolverá las constantes cargadas bajo el espacio de nombres dado, porque usos rubí un enfoque de carga lenta Así, si escribe

Foo.constants.select {|c| Foo.const_get(c).is_a? Class} 

obtendrá

[] 

pero después de escribir:

Foo::Bar 

obtendrá

[:Bar] 
6

En resumen no. Sin embargo, puede mostrar todas las clases que se han cargado. Así que primero tiene que cargar todos los archivos de clase en el espacio de nombres:

Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file} 

continuación, puede utilizar un método como Jörg W Mittag a la lista de las clases

Foo.constants.map (& Foo.method (: const_get)). grep (Clase)

Cuestiones relacionadas