ruby - metodos - que es namespace en programacion
¿Cómo obtener todos los nombres de clase en un espacio de nombres en Ruby? (4)
En resumen, no. Sin embargo, puede mostrar todas las clases que se han cargado. Entonces primero tienes que cargar todos los archivos de clase en el espacio de nombres:
Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file}
entonces puedes usar un método como el de Jörg W Mittag para enumerar las clases
Foo.constants.map (y Foo.method (: const_get)). Grep (Clase)
Tengo un módulo Foo
, que es el espacio de nombres para muchas clases como Foo::Bar
, Foo::Baz
etc.
¿Hay alguna forma de devolver todos los nombres de clase cuyo nombre haya ocupado Foo
?
Esto solo devolverá las constantes cargadas bajo el espacio de nombres dado porque ruby usa un enfoque de carga lenta. Entonces, si escribes
Foo.constants.select {|c| Foo.const_get(c).is_a? Class}
conseguirás
[]
pero después de tipear:
Foo::Bar
conseguirás
[:Bar]
Si, en lugar de los nombres de las constantes, quieres las clases, puedes hacerlo así:
Foo.constants.map(&Foo.method(:const_get)).grep(Class)
Foo.constants
devuelve todas las constantes en Foo
. Esto incluye, pero no se limita a, nombres de clase. Si solo quieres nombres de clase, puedes usar
Foo.constants.select {|c| Foo.const_get(c).is_a? Class}
Si desea nombres de clase y módulo, puede usar is_a? Module
is_a? Module
lugar de is_a? Class
is_a? Class
.