かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

メタプログラミング

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

色々応用すればすこぶる面白いことが出来そう。

仕事の時間なんでこれまで…。