Обычно все, что вы должны делать в Smalltalk, это отправлять сообщения. Вы никогда не выполняете метод, потому что это нарушение инкапсуляции и, как правило, неправильный уровень абстракции.
Когда вы отправляете сообщение, объект-получатель выполняет поиск в своем классе methodDictionary для связывания CompiledMethod с селектором сообщений, если его нет, он затем ищет в суперклассе methodDictionary и т. Д. ... или, наконец, отправляет didNotUnderstand: сообщение, если нет соответствующего метода были найдены. Вся эта техника выполнена в ВМ. Это не работа программиста.
Когда вы хотите отправить сообщение, которое является переменной, вы можете использовать perform:
perform:with:
perform:withArgument:
, как объяснено @ andrei-chis.
selector:= #(printString storeString asString) at: index.
^self perform: selector
Для предоставления доступа к оборудованию низкого уровня мы можем напрямую вызвать метод, отправив сообщение valueWithReceiver:arguments:
, но я настоятельно советую его не использовать ... Такой доступ к оборудованию низкого уровня предназначен для поддержки отладки и, как я сказал, что не правильный уровень абстракции - если вы не пытаетесь реализовать другой язык выше виртуальной машины Smalltalk и не ищете такие низкоуровневые конструкции.
Если вы пропустите это предупреждение, то вы обязаны предоставить экземпляр правильного класса в качестве получателя (или, если вы хотите взломать, по крайней мере, предоставить объекту достаточно места, выделенного для переменных экземпляра и т. Д.) , Наименьшая ошибка при этом: вы можете испортить память объекта и рано или поздно вывести из строя виртуальную машину, а также потерять часть своей работы, если у вас было время сохранить поврежденное изображение до фатального сбоя ...
Итак, одним словом, подумайте о том, чтобы отправлять сообщения объектам, а не вызывать метод; пусть объекты сами решают, какой метод выполнять, это не наше дело, Smalltalk - это сообщения до конца.