ruby:我如何获得作为Module子级的所有Class和/或Module对象?

时间:2011-02-07 05:44:20

标签: ruby

假设我有以下内容:

module A
  class B
    # ...
  end

  # ...
end

假设我有几个不同的文件,具有不同的B值,但都在同一个模块中(A)。从一个require'文件然后require这些文件中的每一个的程序,是否有一种内省/反思的方式(这些是不同的东西?我对这种区别很朦胧,如果是这样的话)确定(并获取对象)模块中的每个类?

我试过这个,这让我有点接近:

A.constants # => ["B"]

但我更愿意回到[A::B],而不是字符串,这样我就可以在其上调用类似singleton_methods的内容,这对我的程序很有用,将数据映射到各种子类方法的调用中。

有没有办法做到这一点?我一直在寻找答案,并找到了一些相关的东西,比如thisthis,但没有任何相关内容。

2 个答案:

答案 0 :(得分:6)

哈!你不知道吗?在写完这篇文章之后,我发现了一个似乎对我有用的答案:

A.constants.collect{|k| A.const_get(k)}.select {|k| k.is_a?(Class)} # => [A::B]
一旦我将正确的部分组合在一起,那很容易。 :)

答案 1 :(得分:0)

这是我的最终解决方案基于林德斯回答:

    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