从块内调用实例方法

时间:2011-05-01 11:53:58

标签: ruby metaprogramming

我试图实现一个类,允许它的子类保存方法块,以便稍后执行它们。它工作,但似乎我采取了错误的方式。看看这个:

class SuperKlass  
  def self.exec_later(&block)
    @@block_for_later = block
  end

  def exec_now
    return unless @@block_for_later
    @@block_for_later.call
  end
end

class ChildKlass < SuperKlass
  exec_later do
    child_method
  end

  def child_method
    puts "Child method called"
  end
end

test_klass = ChildKlass.new
test_klass.exec_now

如果我尝试执行这段代码,则对块中child_method的调用会导致方法缺失错误。有人知道我做错了什么,添加这样的功能的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

exec_later正在ChildKlass的上下文中运行,而不是实例test_klass。由于child_method是一种实例方法,因此无法在ChildKlass找到它。

更新:我找到了解决方案:

  def exec_now
    return unless @@block_for_later
    instance_eval &@@block_for_later
  end