Я занимаюсь исследованиями в Smalltalk-рефлексии, и мне было интересно, возможно ли расширить такой индивидуальный объект, как это возможно, например, в Ruby. При этом я имею в виду селектор, на который реагируют только конкретные объекты.
Вот некоторый код Ruby, который указывает, что я имею в виду. Для пояснения: в Ruby это открывает виртуальный класс для этого объекта и расширяет его с помощью нового определения. Важнейшая роль здесь заключается в том, что ничто не меняется в определении класса!
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
Более конкретно, мой вопрос заключается в том, возможно ли это в стандартных реализациях Squeak/Pharo или других небольших томов, без добавления существенных структур или кода, чтобы это разрешить. Итак, другими словами с регулярными отражающими функциями, которые существуют в Smalltalk.
В качестве примера можно добавить методы, удалить методы, скомпилировать новый код в класс, изменить переменные экземпляра и практически все, но я не нашел способ расширить один объект.
Test addInstVarNamed: #var.
Test compile: 'var ^var'.
t:= Test new.
Test instVarNames.
t instVarNamed: #var put: 666.
t var. #=> 666
Если ответ отрицательный, тогда объясните, почему. Я не ищу решение этой проблемы, а понимаю, почему она не находится в малом объеме.