ボクココ

個人開発に関するテックブログ

Ruby method_missing

引き続き前回の続き。。

前回のと同様に method_missing を実現するとどうなるだろう?


45 class Hoge3
46 def method_missing(name, *args)
47 if name =~ /hoge/
48 p "#{name} was called..."
49 p "Whohooo!"
50 else
51 super
52 end
53 end
54 end
55
56 hoge3 = Hoge3.new
57 (1..3).each do |method|
58 hoge3.send("hoge#{method}")
59 end

こっちのほうが直観的でわかりやすい気もする。
メソッドが定義されていない場合にmethod_missingが呼ばれるので、それを頭の中でイメージしながらやれば、define_methodと同じように実現できる。
だがこっちはメソッド探索をいちいち全部してから呼ばれるため、遅い。 
その点を注意しながらやっていく必要がある。

ちなみにActiveRecordの場合はmethod_missingを呼び出すのは一回だけにして、次からはmethod_missingの中でdefine_methodを定義してそれを呼ぶようにしてるらしい。 さすがだぜ・・。