ruby: Как я могу получить все объекты Class и / или Module, которые являются дочерними для Module? - PullRequest
3 голосов
/ 07 февраля 2011

Предположим, у меня есть следующее:

module A
  class B
    # ...
  end

  # ...
end

И предположим, у меня есть несколько таких файлов, с разными значениями B, но все в одном модуле (A). Из программы, которая require является файлом, а затем require - каждым из этих файлов, существует ли способ с самоанализом / отражением (это разные вещи? Я не уверен в различии, если так), чтобы определить ( и получить объекты для каждого класса в модуле?

Я попробовал это, и это мне как-то близко:

A.constants # => ["B"]

Но я бы предпочел вернуть [A::B], а не строку, чтобы я мог затем вызвать что-то вроде singleton_methods, что было бы полезно для моей программы, которая пытается преобразовать данные в вызовы в методы различных подклассов.

Есть ли способ сделать это? Я искал ответы и нашел несколько связанных с этим вещей, таких как это или это , но ничего такого, на чем можно было бы остановиться.

Ответы [ 2 ]

6 голосов
/ 07 февраля 2011

Хах!Разве вы не знаете это?Сразу после того, как я написал это, я нашел ответ, который, кажется, работает для меня:

A.constants.collect{|k| A.const_get(k)}.select {|k| k.is_a?(Class)} # => [A::B]

Сладко, это было легко, когда я собрал нужные кусочки.:)

0 голосов
/ 15 августа 2014

Вот мое окончательное решение, основанное на ответах Линде:

    def all_classes_in_module_except_base(module_class)
      Dir["#{Rails.root}/app/domains/#{module_class.to_s.underscore}s/*.rb"].each { |file| load file }
      module_class.constants.collect { |k| module_class.const_get(k) }.select { |k|
        k.is_a?(Class) && k.name.demodulize != "Base"
      }
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...