2011-09-23 70 views
7

是否有可能改變類Ruby對象的一旦被實例化,是這樣的:是否有可能改變類Ruby對象的?

class A 
end 

class B 
end 

a = A.new 
a.class = B 

或相似。

(上面的代碼中不作爲類運行是一個只讀變量)

我知道這是不可取的,有點怪,不是我打算做,但是這可能嗎?

+1

你爲什麼要這麼做? (記住[常見問題]:「你應該只問**根據你所面對**實際問題的實際,回答的問題」) – Mat

+0

什麼你希望發生的呢?那麼a有B類的所有方法嗎?因爲那麼'a = B.new'就可以做到這一點。 –

+2

它曾經是可能的:http://www.oreillynet.com/ruby/blog/2007/04/ruby_code_that_will_swallow_yo.html –

回答

6

沒有,這是不可能從內部紅寶石。

理論上可以從C擴展中通過改變給定對象的klass指針,但應該指出,這將完全實現特定的,不適用於直接類型(即,你絕對不能改變類的如一個Fixnum),並且可能以各種方式炸燬。

1

簡單的答案,沒有:

NoMethodError: undefined method `class=' for #<A:0x91a758> 

但是你可以刪除的方法和模塊和混合等,從而留出一個物體,看起來完全不同......

3

當我需要從轉換內置String類的自定義類稱爲MyString,我通過以下做到了:

class MyString < String 
    #Class body here 
end 

class String 
    def to_MyS 
    MyString.new self 
    end 
end 

foo = "bar" 
puts foo.class #=> String 

foo = foo.to_MyS 
puts foo.class #=> MyString 
+0

這不會改變類foo'的'隱蔽!;它創建了一個全新的實例。 – zetetic

相關問題