2010-09-09 7 views

Répondre

47
Foo.constants 

Renvoie toutes les constantes dans Foo. Cela inclut, mais n'est pas limité à, les noms de classe. Si vous ne souhaitez que les noms de classe, vous pouvez utiliser

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

Si vous voulez que les noms de classe et module, vous pouvez utiliser is_a? Module au lieu de is_a? Class.

+1

Ceci est une excellente réponse. On oublie parfois que les constantes dans ruby ​​sont quelque chose qui commence par une majuscule, donc les noms de classe sont des instances constantes de type classe. +1 –

+3

@jcaudle Ruby ne * * pas * paresser les classes de chargement. Tu penses à Rails. – sepp2k

+5

Assurez-vous de charger toutes les classes avant: 'Dir [" app/models/foo/*. Rb "]. Chaque {| fichier | charger le fichier} ' – espinchi

30

Si, au lieu des noms des constantes, vous voulez que les classes elles-mêmes, vous pouvez le faire comme ceci:

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

I * love * programmation sans point. Est-ce que mon Haskell transparaît? –

+1

Je vais vous acheter une bière pour cette réponse! –

+1

Que fait le & &? – shredding

10

Ceci ne retourne les constantes chargées dans l'espace de noms donné parce que les utilisations de rubis une approche de chargement paresseux. Donc, si vous tapez

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

vous obtiendrez

[] 

mais après avoir tapé:

Foo::Bar 

vous obtiendrez

[:Bar] 
6

Bref pas. Cependant, vous pouvez afficher toutes les classes qui ont été chargées. Alors d'abord vous devez charger tous classfiles dans l'espace de noms:

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

vous pouvez utiliser une méthode comme Jörg W Mittag à la liste de classes

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

Questions connexes