2011-05-01 105 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