2011-05-01 109 views
2

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

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。有人知道我做错了什么,以及添加这种功能的正确方法是什么?

回答

4

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

更新:我发现了一个解决方案:

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

大,这个工程。虽然我知道instance_eval,但我不知道它可以用来用&符执行一个块。非常感谢您的回答! – dhoelzgen 2011-05-01 14:29:17

+2

我很高兴能够帮助你,因为我现在正在学习元编程,并且我可以使用一些成功的新知识。 :)关于使用&符号,我学到了很多方法/ proc调用细节[here](http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls#The_ampersand_.28.26.29)。我希望它对你也有用。 – 2011-05-01 14:51:47

+0

这个链接真的对我很有帮助,再次感谢:)我发现另一个链接[这里](http://www.ruby-forum.com/topic/54096#32642)这可能可能有帮助,关于传递参数,如果一个块这样调用。 – dhoelzgen 2011-05-01 17:58:51