2012-03-24 56 views
5

如果您有:如何以递归方式查找模块中的所有模块和类?

module A 
    class B 
    end 
end 

您可以通过A.constants找到B和相似的类。但是,在Ruby 1.9.3中,如果它位于另一个模块中,则不能获得B.在Ruby 1.8.7中,你可以。

module A 
    module Aa 
    class B 
    end 
    end 
end 

如何从A的第一级获得B?我想作为输出为常数,其中包括像B中的所有类的数组,但模块A内的任何地方,如果你确实有圆形的命名空间

+0

你是什么意思,你不能得到乙?我可以使A :: Aa :: B.new,它的工作原理是 – megas 2012-03-24 00:51:40

+0

'MyModule.constants.select {| c | Class === MyModule.const_get(c)}'为你工作? http://stackoverflow.com/questions/833125/find-classes-available-in-a-module – ScottJShea 2012-03-24 01:28:29

+1

是的,你可以直接实例化它。但是,如何填充一个符号列表,其中列出了像B这样的类? Scott:这对Ruby 1.9.3不适用(对于Ruby 1.8.7而言)。由于某些原因,常量不包含模块。 – Jade 2012-03-24 15:22:41

回答

12
class Module 
    def all_the_modules 
    [self] + constants.map {|const| const_get(const) } 
     .select {|const| const.is_a? Module } 
     .flat_map {|const| const.all_the_modules } 
    end 
end 

A.all_the_modules 
# => [A, A::Aa, A::Aa::B] 

该代码将打破,又名 A::Aa::B.const_set(:A, A)

+0

太棒了,谢谢! – Jade 2012-03-26 16:33:33

+1

很酷。谢谢!仅供参考。 http://www.ruby-doc.org/core-2.0.0/Module.html#method-i-const_get – Juguang 2013-12-12 11:38:32

+0

@Juguang似乎是红宝石2.0。 http://ruby-doc.org/core-1.9.3/Module.html#method-i-const_get – Reactormonk 2013-12-15 00:34:37