😸
Ruby で任意のモジュールが mixin されているクラス/モジュールをすべて取得する
任意のモジュールが 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 アプリケーション等で利用する場合はクラスが遅延読み込みされることもあるので注意。
Discussion