2010-09-09 13 views

risposta

47
Foo.constants 

restituisce tutte le costanti in Foo. Questo include, ma non è limitato a, nomi di classe. Se si desidera che i nomi delle classi solo, è possibile utilizzare

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

Se si vuole nomi di classi e moduli, è possibile utilizzare al posto di is_a? Moduleis_a? Class.

+1

Questa è una grande risposta. A volte dimentichi che le costanti in rubino sono tutto ciò che inizia con una maiuscola, quindi i nomi di classe sono istanze costanti di tipo classe. +1 –

+3

@jcaudle Ruby fa * non * le classi di carico pigro. Stai pensando a Rails. – sepp2k

+5

Assicurati di aver caricato tutte le classi prima: 'Dir [" app/models/foo/*. Rb "]. Each {| file | caricare il file} ' – espinchi

30

Se, invece dei nomi delle costanti, si desidera le classi stesse, si potrebbe fare così:

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

I * love * programmazione point-free. Il mio Haskell è visibile? –

+1

Ti comprerò una birra per questa risposta! –

+1

Che cosa fa & fa? – shredding

10

Ciò restituirà solo le costanti caricati sotto il dato spazio dei nomi perché usi rubino un approccio a carico lento. Quindi, se si digita

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

otterrete

[] 

ma dopo aver digitato:

Foo::Bar 

otterrete

[:Bar] 
6

Insomma no. Tuttavia, puoi mostrare tutte le classi che sono state caricate. Quindi, prima si deve caricare tutti classfiles nello spazio dei nomi:

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

quindi è possibile utilizzare un metodo come Jörg W Mittag di elencare le classi

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

Problemi correlati