Rubyでは、定義されていないメソッドが呼び出された場合、通常はNoMethodErrorが発生する。
Rubyはメソッドが呼び出された際に、メソッドが定義されているか親クラスを順に探索し、もしメソッドが定義されていなければmethod_missingメソッドを呼び出す。 このmethod_missingをオーバーライドしてやることにより、実際には定義していないメソッドの呼び出しをフックして処理を行うことができる。
一例として、method_missingを使ったクラスを定義してみよう。 クラスClazzは何のメソッドの実装も持たないが、method_missingメソッドをオーバーライドしている。 これでClazzはあらゆるメソッドに対して、呼び出されたメソッド名と、その引数を標準出力に出力するようになる。
class Clazz
def method_missing(name, *args)
puts "Method #{name} was called with #{args.map{|a| a.inspect}.join(',')}"
end
end
clazz = Clazz.new
clazz.hoge('foo', 'bar', 'buz') # => Method hoge was called with "foo","bar","buz"
method_missingを使ったテクニックは、メタプログラミングで良く利用されており、著名なgemのソースコードでも頻繁に利用されている。柔軟なコードを書くためにもぜひ覚えておきたい。ただ、過剰な使用はコードの可読性を損ねるので、悩ましいところである。
なおRubyのmethod_missingについては、パーフェクトRubyの7-2が詳しい。
パーフェクトRuby (PERFECT SERIES 6)
posted with amazlet at 13.12.01
Rubyサポーターズ すがわら まさのり 寺田 玄太郎 三村 益隆 近藤 宇智朗 橋立 友宏 関口 亮一
技術評論社
売り上げランキング: 10,788
技術評論社
売り上げランキング: 10,788

