2011-04-25 61 views
1
class A 
    def self.a 
    puts "self: #{self}; superclass: #{superclass}" 
    end 
end 

class B < A 
    class << self; undef_method(:a); end # I'm not allowed to use B.a 
    def self.b 
    # here I want to call A.a with B as self. 
    end 
end 

A.a #=> self: A; superclass: Object 
B.b #=> self: B; superclass: A (expected) 

我不想要alias_method解決方案。我正在尋找類似this的東西。Ruby - 在超類中調用另一類方法

UPDATE

溶液不需要是任何類似於上面的鏈路;這只是一個建議。例如,我試圖做的:

class B < A 
    def self.b 
    instance_eval(&A.method(:a).to_proc) 
    end 
end 

但這樣一來我就紅寶石1.8.7得到一個奇怪的ArgumentError

回答

1

這裏唯一的解決方案是使用B.a

class B < A 
    def self.b 
    a #=> self: B; superclass: A 
    end 
end 
2

我不認爲這是可行的使用您鏈接到的超級代理方法。

在這種情況下,A.method(:a)是一種單例方法。 Singleton方法只能綁定到它創建的對象。尤其是,它不能反彈到B

這是第一個非工作的方法我試過:

class B < A 
    def self.b 
    A.method(:a).unbind.bind(self).call 
    end 
end 

二非工作方法:

class B < A 
    class << self 
    define_method :b, A.method(:a) 
    end 
end 

雙方產生了「類型錯誤:開往不同的對象單法」的例外。

+0

謝謝你的嘗試。我也嘗試了第一個。我甚至嘗試過:'instance_eval(&A.method(:a).to_proc)'(在'def self.b'內部),但是後來在Ruby 1.8.7中出現了一個奇怪的ArgumentError。 – 2011-04-25 04:58:43

2

在派生類B中調用方法時,對於派生類的實例,A實例對象和B實例對象之間絕對沒有區別。 他們是完全一樣的對象。

所以當考慮實例方法時,只有一個單一的對象。如你所注意的,在概念上可能的是,如果稍微棘手的是調用在父類中定義的方法,但是當然將派生類作爲自實例。沒有辦法區分「A」對象和「B」對象,但只有一個實例,它們與A和B是「相同的」。但對於類方法,與反彈實例方法並行簡稱不存在。

現在,你正在談論類方法。對於班級方法,如你所知,self是班級。實例毫無意義。你不能稱呼類方法A. 什麼沒有類A或其元類是自我

換句話說,你引用的技巧工作的原因是因爲只有一個對象,而對於派生實例,它是從派生類中命名的。如果不創建未派生父類的第二個實例,則無法做相反的事情。但是現在我們調用類方法了,他們是......好的類方法,所以沒有指望派生類的希望。確切地說,你甚至可以定義什麼?

+0

好吧,我想我不能使用類似於我引用的解決方案。我已經更新了這個問題。謝謝! :) – 2011-04-25 05:11:50