Mam moduł Foo
, który jest obszarem nazw dla wielu klas, takich jak Foo::Bar
, Foo::Baz
i tak dalej.Jak uzyskać wszystkie nazwy klas w przestrzeni nazw w Ruby?
Czy istnieje sposób na zwrócenie wszystkich nazw nazw klas pod numerem Foo
?
Mam moduł Foo
, który jest obszarem nazw dla wielu klas, takich jak Foo::Bar
, Foo::Baz
i tak dalej.Jak uzyskać wszystkie nazwy klas w przestrzeni nazw w Ruby?
Czy istnieje sposób na zwrócenie wszystkich nazw nazw klas pod numerem Foo
?
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
.
Jeżeli zamiast nazw ze stałych, chcesz klasach sobie, można zrobić to tak:
Foo.constants.map(&Foo.method(:const_get)).grep(Class)
I * uwielbiam * programowanie bez użycia punktów. Czy mój Haskell się przejawia? –
Kupię ci piwo za tę odpowiedź! –
Co zrobić i zrobić? – shredding
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]
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)
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 –
@jcaudle Ruby robi * nie * leniwych klas obciążenia. Myślisz o Railsach. – sepp2k
Upewnij się, że wczytałeś wszystkie klasy przed: 'Dir [" app/models/foo/*. Rb "]. Each {| file | wczytaj plik} ' – espinchi