くりにっき

フルスタックキュアエンジニアです

Rubyで特定のmoduleをextendしているかどうか調べる方法

仕事でメタプログラミングしてて調べてました

忙しい人のためのまとめ

extend は特異クラスへの include なので Object#singleton_class.include? する

説明

サンプルコード

class Precure

end

module FormChangeable
  def form_change!
    "かわルンルン!"
  end
end

class SmilePrecure < Precure

end

class HappinessChargePrecure < Precure
  extend FormChangeable
end

classに対してextendしてるのでこういう風に呼べる。

HappinessChargePrecure.form_change!
# => かわルンルン!

SmilePrecure.form_change!
# => NoMethodError: undefined method `form_change!' for SmilePrecure:Class

ただ、FormChangeable がextendされているかどうか調べるようとしたらググってもやり方が見つからずにハマった。

Module#include? があるんだから Module#extend? もあるかと思ったら意外になかった。。。

include? だとダメ。

HappinessChargePrecure.include?(FormChangeable)
# => false

基本に立ち返ってリファレンスを読んでいると、instance method Object#extend

extend の機能は、「特異クラスに対する Module#include」 と言い替えることもできます。

というのを読んでピンときた。

特異メソッドに対して include? すれば解決

HappinessChargePrecure.singleton_class.include?(FormChangeable)
# => true