Ruby の include/extend が分からなくなってきた・・・

by tanabe on March 19, 2007

FileUtils は FileUtils.mkdir といった形で利用ができる。つまり、モジュールの特異メソッドになってるのだけど、module_function を探しても見つからない。

それでもコメントに燦然と輝く "# All methods are module function." の文字。

なんだ??と思って探し回った結果。↓

extend self

そりゃ、そうだぁ。そんなやり方もあったのね。。(あれ、もしかして一般的なの?)

というわけでメモ。

  • クラスメソッド=クラスの特異メソッド。モジュールメソッド=モジュールの特異メソッド。
  • モジュール関数=モジュールの得意メソッドであり、モジュールの private メソッド。
  • self.include(other) とすると、Mixinにより self に other のインタフェースが実装される。
  • self.extend(other) とすると、 other のインスタンスメソッドを self の特異メソッドとして追加する。
  • モジュールをクラスに extend するとモジュールのインスタンスメソッドがクラスメソッドになる。
  • include は、クラス(のインスタンス)に機能を追加。
  • extend は、ある特定のオブジェクトだけにモジュールの機能を追加したいときに使用。
  • モジュールの特異メソッドから内部の private メソッドは参照できない。(undefined local variable or method. include した場合は参照可能。extend だとダメ。)

うーん、わかってたつもりが混乱してきた。

class 内部に extend ModuleName して使うのはイレギュラーな使い方?でも、Forwardable モジュールとかでふつうに使うようなぁ。