2011-09-23 4 views
7

Rubyオブジェクトのクラスを変更することは可能ですか?

インスタンス化されたRubyオブジェクトのクラスを変更することは可能ですか?

class A 
end 

class B 
end 

a = A.new 
a.class = B 

またはそれに類するものです。

+1

あなたがそれをしたいと思う理由:ビルトインStringクラスMyStringと呼ばれるカスタムクラスに、私は次のよう経由でそれをやりましたか? ([faq]を覚えておいてください:実際にあなたが直面している問題に基づいて**実用的で、答えることができる質問をお願いします**) – Mat

+0

何が起こると思いますか?それはクラス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

私はから変換するために必要な

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

関連する問題