Как получить все имена классов в пространстве имен в Ruby?
У меня есть модуль Foo
, что это пространство имен для многих классов, таких как Foo::Bar
, Foo::Baz
и т.д.
Есть ли способ вернуть все имена классов, помеченные Foo
?
Ответы
Ответ 1
Foo.constants
возвращает все константы в Foo
. Это включает в себя, но не ограничивается, имена классов. Если вы хотите только имена классов, вы можете использовать
Foo.constants.select {|c| Foo.const_get(c).is_a? Class}
Если вы хотите имена классов и модулей, вы можете использовать is_a? Module
вместо is_a? Class
.
Ответ 2
Если вместо имен констант вам нужны сами классы, вы можете сделать это следующим образом:
Foo.constants.map(&Foo.method(:const_get)).grep(Class)
Ответ 3
Это приведет только к возврату загруженных констант в заданное пространство имен, потому что Ruby использует ленивый подход к загрузке.
Итак, если вы наберете
Foo.constants.select {|c| Foo.const_get(c).is_a? Class}
вы получите
[]
но после ввода:
Foo::Bar
вы получите
[:Bar]
Ответ 4
Короче нет. Однако вы можете показать все загруженные классы.
Поэтому сначала вам нужно загрузить все файлы классов в пространстве имен:
Dir["#{File.dirname(__FILE__)}/lib/foo/*.rb"].each {|file| load file}
то вы можете использовать метод Jörg W Mittag для перечисления классов
Foo.constants.map(& Foo.method(: const_get)). Grep (класс)