define_methodの練習
ついでに、define_methodも練習してみる。というのも、上の練習の際、メソッド内でdefine_methodを使おうとしたら、ちょっとはまったので。
class Hoge def a def inner; puts "aaaa"; end inner end for_b = "i am b." define_method(:b) { puts "bbbb [#{for_b}]" } def c for_c = "i am c." self.class.class_eval do define_method(:inner) { puts "cccc [#{for_c}]" } end inner end end h = Hoge.new h.a h.b h.c
define_methodにProcを渡すと、Proc同様に外のローカル変数が見れるので重宝すると言われている。
まぁ、それはさておき、メソッド定義内部でdefine_methodを呼ぶと、NoMethodErrorが発生する。これはdefine_methodがModuleのインスタンスメソッドであり、上記サンプルの場合、Hogeクラスのインスタンスメソッドではないから、ってことかなぁ。
一方、defの中でのdef(上記のサンプルの場合、aの中のinner)はHogeインスタンス(h)が定義しているのか…
かなりうろ覚えだけども、特異メソッドみたいなもの?