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...
精彩评论