的`我有這樣的代碼:行爲super`
class B
def self.definer(name, *args, &block)
define_method(name) { self.instance_exec(*args, &block) }
end
end
,當我嘗試使用它,我得到這個錯誤:
B.definer(:tst) { super }
# => :tst
B.new.tst
# => TypeError: self has wrong type to call super in this context: B (expected #<Class:#<Object:0x007fd3008123f8>>)
我明白super
具有特殊的意義,與調用方法有點不同。有人可以解釋爲什麼以及發生了什麼?如果有人爲此提出解決方案,這也會很棒。
我想定義方法我自己的方式,我的意思是做同樣的define_method,但做一些額外的工作之前實際的方法定義和方法體調用之前。 關於'super'必須在方法定義中使用,實際上並不是真的,'define_method'就是一個例子,你可以在它的block中使用'super',它可以正常工作。 可能是正確的問題,我將如何在純ruby中實現'define_method',沒有c代碼,或者它甚至可能實現? – cvb
我認爲問題是在一個'instance_exec'中調用super,它改變'self'和執行的上下文,使得'super'的方法丟失。在這種情況下'自我有錯誤的類型調用super'。我認爲在傳給instance_exec的塊中可能沒有辦法調用super。 – jrochkind
yes好像是在方法定義之外調用'super'的唯一方法就是將塊轉換爲像ruby內部的'rb_add_method'這樣的方法 – cvb