かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

メタプログラミング

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

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

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