是否有可能改变类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 –