是否有可能改變類Ruby對象的一旦被實例化,是這樣的:是否有可能改變類Ruby對象的?
class A
end
class B
end
a = A.new
a.class = B
或相似。
(上面的代碼中不作爲類運行是一個只讀變量)
我知道這是不可取的,有點怪,不是我打算做,但是這可能嗎?
是否有可能改變類Ruby對象的一旦被實例化,是這樣的:是否有可能改變類Ruby對象的?
class A
end
class B
end
a = A.new
a.class = B
或相似。
(上面的代碼中不作爲類運行是一個只讀變量)
我知道這是不可取的,有點怪,不是我打算做,但是這可能嗎?
沒有,這是不可能從內部紅寶石。
理論上可以從C擴展中通過改變給定對象的klass
指針,但應該指出,這將完全實現特定的,不適用於直接類型(即,你絕對不能改變類的如一個Fixnum),並且可能以各種方式炸燬。
簡單的答案,沒有:
NoMethodError: undefined method `class=' for #<A:0x91a758>
但是你可以刪除的方法和模塊和混合等,從而留出一個物體,看起來完全不同......
當我需要從轉換內置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
這不會改變類foo'的'隱蔽!;它創建了一個全新的實例。 – zetetic
你爲什麼要這麼做? (記住[常見問題]:「你應該只問**根據你所面對**實際問題的實際,回答的問題」) – Mat
什麼你希望發生的呢?那麼a有B類的所有方法嗎?因爲那麼'a = B.new'就可以做到這一點。 –
它曾經是可能的:http://www.oreillynet.com/ruby/blog/2007/04/ruby_code_that_will_swallow_yo.html –