一旦Ruby对象被实例化,是否可以更改它的类,如:
class A
end
class B
end
a = A.new
a.class = B
或类似。
(上面的代码没有运行,因为类是只读变量)
我知道这不可取,有点奇怪,而不是我打算做的事情,但有可能吗?
答案 0 :(得分:7)
不,这在红宝石中是不可能的。
理论上可以从C扩展中通过更改给定对象的klass
指针,但应该注意这将完全是特定于实现的,不适用于直接类型(即你肯定不能改变例如fixnum的类别,并且可能以各种方式爆炸。
答案 1 :(得分:2)
当我需要从内置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
答案 2 :(得分:0)
简单回答,不是:
NoMethodError: undefined method `class=' for #<A:0x91a758>
然而,您可以删除方法并混合模块等,以便留下看起来完全不同的对象......