😸

Ruby で任意のモジュールが mixin されているクラス/モジュールをすべて取得する

2024/09/06に公開

任意のモジュールが mixin されているクラス/モジュールに対して機械的に処理したいことが稀によくあるんですが一発で取得するようなメソッドって多分ないんですよねえ。
と、言うことで普段は以下のように ObjectSpace#each_object から全 Module を取得して、それに任意のモジュールが mixin されているかどうかで絞り込んで取得したりしてます。

module M
  include Comparable
end

class X
  include M
end

# Comparable を mixin しているクラスやモジュールを取得する
pp ObjectSpace.each_object(Module).select { _1.include? Comparable }
# => [Float,
#     Integer,
#     Numeric,
#     Warning::buffer,
#     Symbol,
#     String,
#     Complex,
#     Rational,
#     Time,
#     IO::Buffer,
#     File::Stat,
#     X,
#     M,
#     Gem::Version,
#     DidYouMean::ClassNameChecker::ClassName]

もう少し簡略的にかけそうな気がするんですがうーん。
ちなみに Rails アプリケーション等で利用する場合はクラスが遅延読み込みされることもあるので注意。

参照

GitHubで編集を提案

Discussion