Можно ли изменить класс объекта 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>

однако вы можете удалить методы и смешать модули и такие, чтобы оставить объект, который выглядит совершенно иначе...