2012-04-20 51 views
-1

下面是一個包含一些方法模塊:可以將類方法添加到Ruby對象的某些實例中,但不能添加其他類?

module M 
    def x; y; end 
    def y; ...; end 
end 

這裏有一個類:

class C 
    def z; ...; end 
end 

我有C兩個實例:

c1 = C.new 
c2 = C.new 

有什麼我可以做c1這樣c1.classxy,但c2.class不?我沒有看到一種直接的方法來顛覆方法查找。

+1

你能詳細說明一下用例嗎?使用類方法實現特定於實例的功能似乎是一個普遍不好的想法。 – rcrogers 2012-04-20 02:33:34

+0

@ rrogers:不要開玩笑,但要告訴Rails核心開發人員。這正是示波器的工作原理(我正在試圖解決這個問題,正如我在下面的評論中提到的那樣)。 – 2012-04-20 20:15:58

+0

什麼是C#z? – 2012-04-22 03:03:35

回答

0

您可以覆蓋c1.class返回C以外的東西(和其他東西將延長M)。除此之外,沒有。

注意重載c1.class幾乎可以肯定是一個壞主意。一個對象不應該說謊它的類是什麼。

+1

我接受這個,因爲它是唯一真正回答問題的人(「不,不能這樣做」)。 – 2012-04-22 23:31:18

0

也許這

c1.extend(M) 

c1.methods & [:x, :y] #=> [:x, :y] 
c2.methods & [:x, :y] #=> [] 
+0

這並不影響'c1.class'和'c2.class'的方法。 – sepp2k 2012-04-20 01:21:57

+0

我沒有看到c1.class和模塊M之間的任何連接,我只是猜測。 – megas 2012-04-20 01:27:45

+0

的OP希望M的上c1.class方法,這樣他就可以調用'c1.class.x()'和'c1.class.y()',而不是'c2.class.x()'或'C2 .class.y()'。你的代碼沒有達到那個目的。 – sepp2k 2012-04-20 01:31:43

2

而不是做c1.class.x,何樂而不爲c1.x,爲Law Of Demeter建議?

class C 
    def self.x 
    "hi" 
    end 
end 

c1 = C.new 
c2 = C.new 
def c1.x 
    self.class.x 
end 
c1.x # => "hi" 
c2.x # NoMethodError 
+1

我很熟悉Demeter的規律,但正如我所說的,我試圖添加的方法是類方法,而不是實例方法,並且不能以這種方式進行轉換。 (它們是ActiveRecord範圍。)因此這不是一個有效的解決方案。 – 2012-04-20 20:16:51

+1

@John非常感謝您在原始問題沒有解釋爲什麼這不是一個有效的解決方案時投下我的票。 – 2012-04-20 23:29:14

+1

對不起,如果你覺得我已經以某種方式輕視你,儘管對於誰低估你的想法是毫無道理的。但我認爲我非常清楚,這些是課堂上的方法,而不是對象上的方法。 (我在問題中說了兩遍,並且有一段代碼片段來說明一個例子。)如果您認爲它可能更清楚,那麼歡迎您對其進行編輯。 – 2012-04-21 14:47:51

相關問題