Ruby Tips!

RubyのTipsを紹介します

イベントのフックによるリフレクションプログラミング

Rubyでは決まった名前のメソッドを定義しておくと、何かイベントが発生した時に、そのイベントをフックして任意の処理を実行することができる。

代表的なのはmethod_missingというメソッドによるフックだ。このメソッドは、あるオブジェクトで未定義のメソッドが呼び出された場合に、Rubyインタプリタから呼び出される。

以下はmethod_missingにより、メソッドが未定義である旨のメッセージを表示するクラスを定義した例である。このクラスのオブジェクトは、あらゆるメソッド呼び出しに対して、このメッセージを出力することになる。

class VerboseObject
  def method_missing(name)
    puts name.to_s + " is not defined me!"
  end
end

obj = VerboseObject.new
obj.foo # foo is not defined me!
obj.bar # bar is not defined me!
obj.buz # buz is not defined me!

このような、リフレクションプログラミングで利用できるメソッドと、その呼び出しのタイミングを以下にまとめる。

メソッド 呼び出しのタイミング
method_missing 未定義のメソッド呼び出し時
respond_to_missing? respond_to?を呼び出してfalseの時
method_added メソッドが定義された時
method_removed メソッドが削除された時
method_undefined メソッドがundefされた時
singleton_method_added 特異メソッドが定義された時
singleton_method_removed 特異メソッドが削除された時
singleton_method_undefined 特異メソッドがundefされた時
const_missing 参照された定数が存在しない時
append_features モジュールがincludeされる前
included モジュールがincludeされた後
extend_object モジュールがextendされる前
extended モジュールがextendされた後
inherited クラスが継承された時