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

Jad*_*ade 7 ruby

如果你有:

module A
  class B
  end
end
Run Code Online (Sandbox Code Playgroud)

你可以通过A.constants找到B和类似的类.但是,在Ruby 1.9.3中,如果它在另一个模块中,则无法获得B. 在Ruby 1.8.7中你可以.

module A
  module Aa
    class B
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

你怎么从A的第一级获得B?我想输出的是一个常量数组,其中包括所有类,如B,但在模块A中的任何位置.

Rea*_*onk 15

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]
Run Code Online (Sandbox Code Playgroud)

如果你有圆形名称空间,这个代码将会中断 A::Aa::B.const_set(:A, A).