modules = ObjectSpace.each_object(Module).to_a
puts modules
puts modules.reject(&:singleton_class?) # 特異クラスを外す場合
公式のドキュメントのObjectSpaceから引用。
each_object(klass) -> Enumerator
指定された klass と Object#kind_of? の関係にある全てのオブジェクトに対して繰り返します。引数が省略された時には全てのオブジェクトに対して繰り返します。
上記のコードはRubyで定義されている全てのオブジェクトに対して kind_of?(Module)
を実行しており、ClassとModuleに属するオブジェクトはこの判定式がtrueになるので、全てのClassとModuleが取得できます。
特異クラスを外したい場合は singleton_class?
を実行して true
を返すものを外します。