开发者

Is it possible to change the class of a Ruby object?

Is it possible to change the class of a Ruby object once it has been instantiated, 开发者_StackOverflow中文版something like:

class A
end

class B
end

a = A.new
a.class = B

or similar.

(the above code does not run as class is a read only variable)

I know this is not advisable, a bit strange, and not something I plan on doing, but is it possible?


No, this is not possible from within ruby.

It is theoretically possible from within a C extension by changing the klass pointer of the given object, but it should be noted that this will be completely implementation-specific, will not work for immediate types (i.e. you definitely can't change the class of e.g. a fixnum), and might blow up in various ways.


When I needed to convert from the built-in String class to a custom class called MyString, I did it via the following:

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


simple answer, no:

NoMethodError: undefined method `class=' for #<A:0x91a758>

however you can delete methods and mix in modules and such so as to leave an object that looks totally different...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜