Передача сообщений
Smalltalk использует передачу сообщений, а не вызов метода.Различие тонкое, но невероятно мощное.
Некоторая терминология: если foo bar: baz
, #bar:
является селектором , то foo является получателем сообщения, называемого#bar:
(символом # обозначается символ, очень похожий на то, что Common Lisp сказал бы 'bar
(или, что более правильно, :bar
)), а baz
- это аргумент или параметр .Когда строка выполнена, foo
отправляется сообщение #:bar:
с аргументом baz
.Пока это довольно нормально.В Java это выглядело бы как foo.bar(baz);
.
В Java система времени выполнения выяснила бы фактический тип foo
, нашла бы наиболее подходящий метод и запустила его.
Вещивыглядят почти так же в Smalltalk.Когда вы отправляете объекту сообщение, он ищет в своем словаре методов метод, имя которого совпадает с именем селектора сообщения.Если он не может его найти, он ищет в словаре методов своего суперкласса и так далее.Довольно обычный материал.
Если он не может найти подходящий метод, он отправляет себе сообщение #doesNotUnderstand:
с исходным сообщением в качестве параметра.(Да, отправка сообщения - это объект.) Но #doesNotUnderstand:
также является методом.Вы можете переопределить его.
Например, у вас может быть объект, который отвечает на некоторый набор сообщений при пересылке любых других сообщений, которые он получает, на некоторый объект делегата.Переопределите #doesNotUnderstand:
и, привет, у вас есть прокси-сервер, который не требует обслуживания для поддержания синхронизации его протокола с делегатом.
Простой синтаксис
Нет, я не шучу.Вся грамматика Smalltalk может быть длиной в 15 строк.JLS это ... нет.Зачем это нужно?Простой синтаксис позволяет легко разбить кусок кода на части.Метапрограммирование!Рефакторинг!
Нет синтаксиса для:
- условных операторов:
(n < 3) ifTrue: ['yes'] ifFalse: ['no']
- для циклов:
1 to: 10 do: [:i | Transcript show: i asString]
- try-catch:
[i := i / 0] ifError: ['oops!']
- try-finally:
[i := i / 0] ensure: [stream close]
И обратите внимание на все эти []
s - первоклассные замыкания с чистым синтаксисом.