Czy możliwe jest rozszerzenie pojedynczego obiektu w Smalltalk
Robię badania w refleksji Smalltalk i zastanawiałem się, czy możliwe byłoby rozszerzenie takiego obiektu, jak to byłoby możliwe na przykład w Ruby. Mam na myśli selektor, na który odpowiadają tylko poszczególne obiekty.
Oto kod Rubiego, który mówi, co mam na myśli. Dla wyjaśnienia: w Rubim otwiera to klasę wirtualną dla tego obiektu i rozszerza ją o nową definicję. Istotną częścią jest to, że nic nie zmienia definicji klasy!
o = Object.new
o.instance_eval {def foo;puts "foo";end}
o.foo #=> "foo"
#however this will fail:
m = Object.new
m.foo #=> NoMethod error
Dokładniej, moje pytanie dotyczy tego, czy jest to możliwe w standardowych implementacjach Squeak / Pharo lub innych małych implementacjach, bez dodawania istotnych struktur lub kodu, aby to umożliwić. Czyli z innymi słowami z regularnymi elementami odblaskowymi, które istnieją w Smalltalk.
Jako przykład można dodawać metody, usuwać metody, kompilować nowy kod do klasy, zmieniać zmienne instancji i prawie wszystko, ale nie znalazłem sposobu na rozszerzenie pojedynczego obiektu.
Test addInstVarNamed: #var.
Test compile: 'var ^var'.
t:= Test new.
Test instVarNames.
t instVarNamed: #var put: 666.
t var. #=> 666
Jeśli odpowiedź brzmi „nie”, wyjaśnij dlaczego. Nie szukam rozwiązania tego problemu, ale raczej rozumiem, dlaczego nie ma problemu.