2011-09-23 12 views
7

¿Es posible cambiar la clase de un objeto de Rubí, una vez que se ha creado una instancia, algo así como:¿Es posible cambiar la clase de un objeto Ruby?

class A 
end 

class B 
end 

a = A.new 
a.class = B 

o similar.

(el código anterior no se ejecuta como clase es una única variable de lectura)

Sé que esto no es recomendable, un poco extraño, y no es algo que planeo hacer, pero ¿es posible?

+1

¿por qué quieres hacer eso? (Recuerde [faq]: "Solo debe formular preguntas prácticas y que respondan ** en función de los problemas reales a los que se enfrenta **") – Mat

+0

¿Qué espera que suceda? ¿Entonces a tiene todos los métodos de la clase B? Porque entonces 'a = B.new' haría eso. –

+2

Solía ​​ser posible: http://www.oreillynet.com/ruby/blog/2007/04/ruby_code_that_will_swallow_yo.html –

Respuesta

6

No, esto no es posible desde Ruby.

Teóricamente es posible desde dentro de una extensión C cambiando el puntero klass del objeto dado, pero debe tenerse en cuenta que esto será completamente específico de la implementación, no funcionará para tipos inmediatos (es decir, definitivamente no se puede cambiar la clase de, por ejemplo, un fixnum), y podría explotar de varias maneras.

1

respuesta simple, no:

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

Sin embargo, puede eliminar los métodos y mezclar en módulos y tal modo que deje un objeto que se ve totalmente diferente ...

3

cuando tenía que convertir de la incorporada en String clase a una clase personalizada denominada MyString, lo hice a través de lo siguiente:

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

Esto no cambia la clase de 'foo'; crea una nueva instancia. – zetetic

Cuestiones relacionadas