2010-09-09 10 views

Antwort

47
Foo.constants 

gibt alle Konstanten in Foo zurück. Dies beinhaltet, ist aber nicht beschränkt auf, Klassennamen. Wenn Sie nur Klassennamen möchten, können Sie

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

verwenden Wenn Sie Klassen- und Modulnamen möchten, können Sie is_a? Module statt is_a? Class verwenden.

+1

Dies ist eine gute Antwort. Sie vergessen manchmal, dass Konstanten in Ruby alles sind, was mit einem Großbuchstaben _startet_, also Klassennamen sind konstante Instanzen der Typklasse. +1 –

+3

@jcaudle Ruby tut * nicht * Lazy Load-Klassen. Du denkst an Rails. – sepp2k

+5

Stellen Sie sicher, dass Sie zuvor alle Klassen geladen haben: 'Dir [" app/models/foo/*. Rb "]. Jede {| Datei | Datei laden} ' – espinchi

30

Wenn anstelle der Namen der Konstanten, möchten Sie die Klassen selbst, können Sie es wie folgt tun:

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

I * Liebe * Punkt-freie Programmierung. Ist mein Haskell durch? –

+1

Ich werde dir ein Bier für diese Antwort kaufen! –

+1

Was macht das &? – shredding

10

Dies wird die geladenen Konstanten unter dem angegebenen Namespace weil Rubin verwendet nur zurückgeben ein Lazy-Load-Ansatz. Also, wenn Sie

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

geben Sie erhalten

[] 

aber nach der Eingabe:

Foo::Bar 

Sie

[:Bar] 
6

Kurz gesagt bekommen nicht. Sie können jedoch alle Klassen anzeigen, die geladen wurden. Also zuerst müssen Sie alle Klassendateien im Namensraum laden:

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

dann können Sie eine Methode, wie Jörg W Mittag des verwenden, um die Klassen

Foo.constants.map zur Liste (& Foo.method (: const_get)). grep (Klasse)

Verwandte Themen