Как получить все имена классов в пространстве имен в Ruby? - PullRequest
45 голосов
/ 09 сентября 2010

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

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

Ответы [ 4 ]

56 голосов
/ 09 сентября 2010
Foo.constants

возвращает все константы в Foo. Это включает, но не ограничивается, имена классов. Если вам нужны только имена классов, вы можете использовать

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

Если вам нужны имена классов и модулей, вы можете использовать is_a? Module вместо is_a? Class.

32 голосов
/ 10 сентября 2010

Если вместо имен констант вы хотите сами классы, вы можете сделать это следующим образом:

Foo.constants.map(&Foo.method(:const_get)).grep(Class)
12 голосов
/ 23 июля 2013

короче нет. Тем не менее, вы можете показать все классы, которые были загружены. Итак, сначала вы должны загрузить все файлы классов в пространстве имен:

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

тогда вы можете использовать такой метод, как Йорг Миттаг, для перечисления классов

Foo.constants.map (& Foo.method (: const_get)). Grep (класс)

12 голосов
/ 05 января 2012

Это вернет только загруженные константы в заданном пространстве имен, потому что ruby ​​использует подход с отложенной загрузкой.Так, если вы наберете

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

, вы получите

[]

, но после ввода:

Foo::Bar

вы получите

[:Bar]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...