クラス拡張ミックスイン
メタプグラミングRubyの221ページにクラス拡張ミックスインというイディオムについての解説があったので写経してみた。
この『クラス拡張ミックスイン』は、モジュールをincludeした時にインスタンスメソッドとクラスメソッドを両方取り込みたい時に使うものらしい。
module Basicalbe def self.included(base) base.extend(ClassMethod) end def hai p("hello instance method") end module ClassMethod def hai p("hello class method") end end end class Hoge include Basicalbe end Hoge.new.hai # => "hello instance method" Hoge.hai # => "hello class method"
def self.included(base)
これはフックメソッド。
このフックメソッドは、フックメソッドが所属するモジュールがincludeされた時に実行する。
この例では、class Hoge内でincludeしているので、その時に実行される。
includedの仮引数は、includeされた時点でのselfとなるので、この場合ではHogeが格納されている。
そのままbase(Hoge)に対して、Basicable::ClassMethodをextendしている。
Rails4からはConcernsがあるので、自分でRailsモジュールを書く時にこのイディオムを使う機会はあまりないと思うけど
ライブラリを読む時にはこういう読み方を知らないと読めなさそうなので覚えておきたい。