Comment obtenir tous les noms de classes dans un espace de noms dans Ruby?

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)