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