2010-09-09 13 views

Odpowiedz

47
Foo.constants 

zwraca wszystkie stałe w Foo. Obejmuje to, ale nie ogranicza się do nazw klas. Jeśli chcesz tylko nazwy klasy, można użyć

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

Jeśli chcesz nazwy klas i modułów, można użyć is_a? Module zamiast is_a? Class.

+1

To jest świetna odpowiedź. Czasami zapominasz, że stałe w ruby ​​są wszystkim, co _starts_ z kapitałem, więc nazwy klas są stałymi instancjami klasy typu. +1 –

+3

@jcaudle Ruby robi * nie * leniwych klas obciążenia. Myślisz o Railsach. – sepp2k

+5

Upewnij się, że wczytałeś wszystkie klasy przed: 'Dir [" app/models/foo/*. Rb "]. Each {| file | wczytaj plik} ' – espinchi

30

Jeżeli zamiast nazw ze stałych, chcesz klasach sobie, można zrobić to tak:

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

I * uwielbiam * programowanie bez użycia punktów. Czy mój Haskell się przejawia? –

+1

Kupię ci piwo za tę odpowiedź! –

+1

Co zrobić i zrobić? – shredding

10

ten powróci tylko załadowane stałych ramach danej przestrzeni nazw, ponieważ używa Rubiego podejście leniwego obciążenia. Więc jeśli wpiszesz

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

dostaniesz

[] 

ale po wpisaniu:

Foo::Bar 

dostaniesz

[:Bar] 
6

Krótko mówiąc nie. Możesz jednak wyświetlić wszystkie załadowane klasy. Więc najpierw trzeba załadować wszystkie classfiles w przestrzeni nazw:

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

Następnie można użyć metody takie jak Jörg W Mittag do listy klas

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

Powiązane problemy