Подтвердить что ты не робот

Как получить все имена классов в пространстве имен в Ruby?

У меня есть модуль Foo, что это пространство имен для многих классов, таких как Foo::Bar, Foo::Baz и т.д.

Есть ли способ вернуть все имена классов, помеченные Foo?

4b9b3361

Ответ 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 (класс)