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)が定義しているのか…
かなりうろ覚えだけども、特異メソッドみたいなもの?