イベントのフックによるリフレクションプログラミング
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 | クラスが継承された時 |