仕事でメタプログラミングしてて調べてました
忙しい人のためのまとめ
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