2011-09-23 19 views
7

Czy jest możliwe, aby zmienić klasę obiektu Ruby raz została instancja, coś takiego:Czy można zmienić klasę obiektu Ruby?

class A 
end 

class B 
end 

a = A.new 
a.class = B 

lub podobnym.

(powyższy kod nie działa w klasie jest tylko do odczytu zmiennej)

wiem, że to nie jest wskazane, trochę dziwne, a nie coś, co planujesz robić, ale jest to możliwe?

+1

Dlaczego chcesz to zrobić? (Pamiętaj [faq]: "Powinieneś zadawać tylko praktyczne, odpowiadające pytania ** w oparciu o rzeczywiste problemy, z którymi musisz się spotkać **") – Mat

+0

Co byś się spodziewał? Że to ma wszystkie metody klasy B? Bo wtedy zrobiłaby to 'a = B.new'. –

+2

Kiedyś było to możliwe: http://www.oreillynet.com/ruby/blog/2007/04/ruby_code_that_will_swallow_yo.html –

Odpowiedz

6

Nie, nie jest to możliwe z poziomu ruby.

Jest to teoretycznie możliwe z rozszerzenia C, zmieniając wskaźnik klass danego obiektu, ale należy zauważyć, że będzie to całkowicie zależne od implementacji, nie będzie działać dla typów natychmiastowych (tj. Zdecydowanie nie można zmienić klasę np. fixnum) i może wybuchnąć na różne sposoby.

1

prosta odpowiedź, no:

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

jednak można usuwać metodami i mieszać w modułach i takie tak, aby pozostawić obiekt, który wygląda zupełnie inaczej ...

3

Kiedy potrzebowałem przekonwertować z wbudowany String klasy do klasy niestandardowego nazywany MyString, zrobiłem to poprzez następujące:

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

Nie zmienia to klasy 'foo'; tworzy zupełnie nową instancję. – zetetic

Powiązane problemy