Robię badania w refleksji Smalltalk, i zastanawiałem się, czy możliwe było rozszerzenie pojedynczego obiektu, jak to byłoby możliwe na przykład w Ruby. Mam tu na myśli selektor, na który reagują tylko określone obiekty.Czy możliwe jest rozszerzenie pojedynczego obiektu w Smalltalk
Oto kod Ruby, który określa, co mam na myśli. Dla wyjaśnienia: w Ruby otwiera to wirtualną klasę dla tego obiektu i rozszerza ją o nową definicję. Najważniejszą częścią jest to, że nic nie zmienia się w 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 brzmi, czy jest to możliwe w standardowej Squeak/Pharo lub innych Smalltalk implementacjach, bez dodawania znaczących struktur lub kod na to zezwolić. Więc innymi słowy z regularnymi funkcjami 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, to dlaczego. Nie szukam rozwiązania tego problemu, ale raczej rozumiem, dlaczego nie jest on w małym rozmiarze.
Przeczytałem już pierwsze łącze, ale może być trudno wytworzyć rzeczywisty pomysł za tym, co właśnie wyjaśniłeś. Na pewno sprawdzę inne linki. Znakomita odpowiedź. – froginvasion
Może screencast (link 3D) da ci lepsze zrozumienie. Próbuję znaleźć * papier *, który wyjaśnia szczegółowo, jak lekkie lekcje działają, ale nie mogę tego znaleźć. Daj mi kilka minut :) –
Niestety, nadal nie mogę go znaleźć. Dodałem jednak piąty link z doskonałym wyjaśnieniem, jak działa wyszukiwanie metody w Smalltalk i różne techniki używane do manipulowania dostarczaniem wiadomości. Odwołuje się także do lekkiego podejścia klasowego. –