J’ai un module Foo
, c’est l’espace de noms pour beaucoup de classes comme Foo::Bar
, Foo::Baz
et ainsi de suite.
Existe-t-il un moyen de renvoyer tous les noms de classe placés par Foo
?
Foo.constants
renvoie toutes les constantes dans Foo
. Cela inclut, mais sans s’y limiter, les noms de classe. Si vous ne voulez que les noms de classe, vous pouvez utiliser
Foo.constants.select {|c| Foo.const_get(c).is_a? Class}
Si vous voulez des noms de classe et de module, vous pouvez utiliser is_a? Module
is_a? Module
au lieu de is_a? Class
is_a? Class
Si, au lieu des noms des constantes, vous voulez les classes elles-mêmes, vous pouvez le faire comme ceci:
Foo.constants.map(&Foo.method(:const_get)).grep(Class)
Cela ne renverra que les constantes chargées sous l’espace de noms donné, car Ruby utilise une approche de chargement différé. Donc, si vous tapez
Foo.constants.select {|c| Foo.const_get(c).is_a? Class}
tu auras
[]
mais après avoir tapé:
Foo::Bar
tu auras
[:Bar]
En bref non. Cependant, vous pouvez afficher toutes les classes chargées. Donc, vous devez d’abord charger tous les fichiers de classe dans l’espace de noms:
Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file}
alors vous pouvez utiliser une méthode comme celle de Jörg W Mittag pour lister les classes
Foo.constants.map (& Foo.method (: const_get)). Grep (Class)