Railsによるメタプログラミングを読んでみた。
気になったところをメモ!
存在しないメソッドを呼んだときに呼ばれるメソッド
method_missingというメソッドがそうらしい
早速実験
class Hoge def method_missing(method, *args, &block) puts "missing" end end h = Hoge.new h.hoge
実行結果
missing
お〜っ本当だ!
各引数には何が渡ってくるんだろう?
こういうときはドキュメントを…
引用
Object#method_missing(method_symbol, ...) メソッドがオブジェクトに定義されていなかったときにこのメソッドが呼ばれる。これを使って自分の知らないメソッドをほかのオブジェクトに委譲することができる。
ふ〜ん。俺が使ってるのとはちょっと引数が違うなぁ。
名前から大体創造できるけど、メソッドに何が渡ってくるか確認。
class Hoge def method_missing(method, *args, &block) p method p args p block end end
として
h = Hoge.new h.hoge "Hello", "world"
とすると、実行結果
:hoge ["Hello", "world"] nil
シンボル、引数の配列、何かが渡ってくる。
最後のはblockだろうか?確認
h = Hoge.new h.hoge { |foo| }
実行結果
:hoge [] #<Proc:0x00000000@C:/DOCUME~1/himitsu/LOCAL
結果はよくわからんが、そうみたい。
sendメソッド??
send(name[, args ... ]) send(name[, args ... ]) { .... } __send__(name[, args ... ]) __send__(name[, args ... ]) { ... } オブジェクトのメソッド name を、引数に args を渡して呼び出し、メソッドの実行結果を返します。
こんなのもあったのか…
実験コード
class Hoge def say_hello puts "Hello world" end end h = Hoge.new h.send(:say_hello)
実行結果
Hello world
色々応用すればすこぶる面白いことが出来そう。
仕事の時間なんでこれまで…。