Ho un modulo Foo
, che è lo spazio dei nomi per molte classi come Foo::Bar
, Foo::Baz
e così via.Come ottenere tutti i nomi di classe in uno spazio dei nomi in Ruby?
Esiste un modo per restituire tutti i nomi di classe assegnati dallo ?
Ho un modulo Foo
, che è lo spazio dei nomi per molte classi come Foo::Bar
, Foo::Baz
e così via.Come ottenere tutti i nomi di classe in uno spazio dei nomi in Ruby?
Esiste un modo per restituire tutti i nomi di classe assegnati dallo ?
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? Module
is_a? Class
.
Se, invece dei nomi delle costanti, si desidera le classi stesse, si potrebbe fare così:
Foo.constants.map(&Foo.method(:const_get)).grep(Class)
I * love * programmazione point-free. Il mio Haskell è visibile? –
Ti comprerò una birra per questa risposta! –
Che cosa fa & fa? – shredding
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]
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)
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 –
@jcaudle Ruby fa * non * le classi di carico pigro. Stai pensando a Rails. – sepp2k
Assicurati di aver caricato tutte le classi prima: 'Dir [" app/models/foo/*. Rb "]. Each {| file | caricare il file} ' – espinchi