假设我有以下内容:
module A
class B
# ...
end
# ...
end
假设我有几个不同的文件,具有不同的B值,但都在同一个模块中(A)。从一个require
'文件然后require
这些文件中的每一个的程序,是否有一种内省/反思的方式(这些是不同的东西?我对这种区别很朦胧,如果是这样的话)确定(并获取对象)模块中的每个类?
我试过这个,这让我有点接近:
A.constants # => ["B"]
但我更愿意回到[A::B]
,而不是字符串,这样我就可以在其上调用类似singleton_methods
的内容,这对我的程序很有用,将数据映射到各种子类方法的调用中。
答案 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