引き続き前回の続き。。
前回のと同様に 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を定義してそれを呼ぶようにしてるらしい。 さすがだぜ・・。