Is it possible to change the class of a Ruby object once it has been instantiated, something like:
class A
end
class B
end
a = A.new
a.class = B
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...
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.