如何递归地找到模块中的所有模块和类?

如果你有:

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中的任何位置。

 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)这段代码将会中断。