2011-09-23 69 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

相关问题