是否可以更改Ruby对象的类?

时间:2011-09-23 11:54:13

标签: ruby class object

一旦Ruby对象被实例化,是否可以更改它的类,如:

class A
end

class B
end

a = A.new
a.class = B

或类似。

(上面的代码没有运行,因为类是只读变量)

我知道这不可取,有点奇怪,而不是我打算做的事情,但有可能吗?

3 个答案:

答案 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>

然而,您可以删除方法并混合模块等,以便留下看起来完全不同的对象......