Можно ли изменить класс объекта Ruby? - PullRequest
7 голосов
/ 23 сентября 2011

Можно ли изменить класс объекта Ruby после его создания, например:

class A
end

class B
end

a = A.new
a.class = B

или аналогичный.

(приведенный выше код не работает как класспеременная только для чтения)

Я знаю, что это не рекомендуется, немного странно и не то, что я планирую делать, но возможно ли это?

Ответы [ 3 ]

7 голосов
/ 23 сентября 2011

Нет, это невозможно изнутри ruby.

Теоретически это возможно из расширения C путем изменения указателя klass данного объекта, но следует отметить, что это будетзависящий от реализации, не будет работать для непосредственных типов (то есть вы определенно не сможете изменить класс, например, fixnum) и может взорваться различными способами.

2 голосов
/ 21 января 2016

Когда мне нужно было преобразовать встроенный класс 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
0 голосов
/ 23 сентября 2011

простой ответ, нет:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...