tawara's blog

雑記。個人の見解です。

モジュールの include と extend と prepend

モジュールをクラスや別のモジュールへ読み込ませること、つまりモジュールの機能を追加することをミックスインという。そのミックスインの方法には include と extend に大別できる。

例えばクラスにモジュールを include すると モジュールのメソッドを、クラスのインスタンスで利用することができる。一方で、クラスにモジュールをextendすると、クラスの特異メソッド(クラスメソッド)として利用することができる。両者の利用シーンは、ミックスインされたクラスに関して、モジュールのメソッドを、インスタンスメソッドとして利用したいのか、クラスメソッドとして利用したいのかの違いとなる。腹落ちしてしまえばそんなに混乱することはない。

そして include の亜種としてprependが存在する。メソッド探索の順番が異なる。include でモジュールをミックスインした場合、メソッド探索は 【ミックスインされたクラス→モジュール】 となる。一方で、prepend でモジュールをミックスインした場合、メソッド探索の順番が 【モジュール→ミックスインしたクラス】 となる。とにかく先にモジュールをメソッド探索して欲しい場合に、prependを使うよう。

参考 第8章

(了)