module内のproc

[ruby-list:41831]よりmodule内のProcオブジェクトのコンテキストに関して。

module Module1
  def func1
    # 何らかの処理
  end
  Func = proc {
    func1
  }
  def func2
    Func
  end
end

class Class1
  include Module1
end

obj = Class1.new
obj.func1 #=> 動作する
obj.func2.call
  #=> NameError: undefined local variable or method `func1' for Module1:Module

obj#func2でFuncのcallが呼び出されたとき、Procオブジェクトが実行されるコンテキストはModule1であるので、Module1#func1は直接呼び出すことが出来ないようです。

Procオブジェクトを生成するメソッドをModuleの中で定義してやれば良さそうです。(何回もProcオブジェクトを作っているのは効率が悪いですが。

module Module1
  def func1
  end
  def make_proc
    proc {
      func1
    }
  end
  def func2
    make_proc
  end
end