2012-11-05 52 views
11

我想知道如果我能迫使這種情況發生Ruby未綁定方法:是否可以強制綁定到其他類的實例?

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.instance_method(:bomb) 

b = B.new 
bomb.bind(b) 

目前它拋出的錯誤類型錯誤:綁定參數必須是一個

的情況下,我覺得這方面有什麼我能做的非常有限利用這些未綁定的方法,可能性有點限制。在這些情況下(我不只是指冪等函數),它會是對的嗎?一個執行錯誤就足夠了,萬一我會處理A中的變量,而這些變量不在B中複製。我真的很想知道如何強制這個綁定。

+0

一些有趣這是可能的:'Object.instance_method(:to_s)。.bind( 「世界你好」)調用#=>「#<字符串:0x0000000195e1f0> 「'。我不認爲有可能在你的例子中強制綁定。 –

+2

是的,那是因爲String從Object繼承而來,並且可以將超類實例方法綁定到它的子類實例。一個例子:A類; def t; 「一個」 ;結束 ;結束 ; B類 ChuckE

+0

如果'A'本來是一個'模塊',那麼它可能在紅寶石2 –

回答

2

你不能用另一個類的方法綁定一個類的實例。 除非實例是這個類或其子類的一個對象。

這也是顯而易見的,一個類的細節不能轉移到其他類的實例。它只能與被授權攜帶該信息的實例綁定,即該類或其子類的實例。

因此,紅寶石還維護封裝通過不綁定方法的特定類與另一類的實例。

0

Method和UnboundMethod類型期望綁定目標必須是您引用該方法的原始類的子類。將該方法轉換爲proc可以消除子類約束,但只有Method已經實現了to_proc方法。

class A 
    def bomb ; "bomb" ; end 
end 

class B ; end 

bomb = A.new.method(:bomb) 

B.send(:define_method, :bomb_in_b, &bomb) #converting to proc 

b = B.new 
puts b.bomb_in_b 

在紅寶石測試2.2.3

相關問題