2015-10-16 59 views
0

的`我有這樣的代碼:行爲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具有特殊的意義,與調用方法有點不同。有人可以解釋爲什麼以及發生了什麼?如果有人爲此提出解決方案,這也會很棒。

回答

0

我沒有收到與您一樣的錯誤消息,但仍然收到錯誤消息。必須在方法定義中使用super。但是你沒有在方法定義中使用它。這提出了一個錯誤。

關於解決方案,我不能給你一個,因爲它根本不清楚你想做什麼。

+0

我想定義方法我自己的方式,我的意思是做同樣的define_method,但做一些額外的工作之前實際的方法定義和方法體調用之前。 關於'super'必須在方法定義中使用,實際上並不是真的,'define_method'就是一個例子,你可以在它的block中使用'super',它可以正常工作。 可能是正確的問題,我將如何在純ruby中實現'define_method',沒有c代碼,或者它甚至可能實現? – cvb

+0

我認爲問題是在一個'instance_exec'中調用super,它改變'self'和執行的上下文,使得'super'的方法丟失。在這種情況下'自我有錯誤的類型調用super'。我認爲在傳給instance_exec的塊中可能沒有辦法調用super。 – jrochkind

+0

yes好像是在方法定義之外調用'super'的唯一方法就是將塊轉換爲像ruby內部的'rb_add_method'這樣的方法 – cvb

0

你絕對不希望instance_exec那裏。

如果你沒有足夠的* ARGS參與,我說你只是想這樣:

def self.definer(name, &block) 
    define_method(name, &block) 
end 

但隨後新definer方法將做define_method確實擺在首位的同樣的事情,所以沒有理由創建它,而不是首先使用define_method

你究竟在做什麼?解釋你想做什麼,也許有人可以幫助你。

但我認爲在現有的實施instance_exec是不是你想要的 - 叫define_method當它立刻在definer調用,執行塊 - 我想你想運行的程序段時,您所定義的方法被調用呢?但我不確定,這取決於你想做什麼,哪一個不清楚。 superinstance_exec - 超到內沒有任何意義,你認爲你會打電話給什麼方法?

+0

這裏的例子減少了,實際的用法可以在這裏找到https:// github。 COM/jdantonio /官能紅寶石/斑點/主/ LIB /功能/ pattern_matching.rb#L134。關於'super'應該調用什麼方法,我認爲是當前方法,它被執行,我的意思是當你將塊發送給'define_method'超級工作時,ruby有一些方法來指定塊執行的上下文,所以我想要是完全相同的,在某種方法的上下文中評估我的代碼。 – cvb