Можно ли изменить класс объекта Ruby?
можно ли изменить класс объекта Ruby после его создания, например:
class A
end
class B
end
a = A.new
a.class = B
или аналогичные.
(приведенный выше код не запускается как класс является переменной только для чтения)
Я знаю, что это не целесообразно, немного странно, и не то, что я планирую делать, но возможно ли это?
3 ответов
нет, это невозможно изнутри ruby.
теоретически это возможно из расширения C путем изменения klass
указатель данного объекта, но следует отметить, что это будет полностью специфично для реализации, не будет работать для непосредственных типов (т. е. вы определенно не можете изменить класс, например, fixnum), и может взорваться различными способами.
когда мне нужно было конвертировать из встроенного 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
простой ответ, нет:
NoMethodError: undefined method `class=' for #<A:0x91a758>
однако вы можете удалить методы и смешать модули и такие, чтобы оставить объект, который выглядит совершенно иначе...