Да, у Smalltalk есть закрытия. Следующий код создает замыкание, которое возвращает сумму двух его аргументов:
sum := [ :a :b | a + b ].
Закрытия - это объекты, которые можно создавать, передавать и манипулировать ими. Для оценки закрытия вы отправляете value
, value:
, value:value:
, ...
sum value: 1 value: 2.
Замыкания широко используются в коллекциях для итерации, фильтрации, сопоставления, ... всех значений коллекции:
aCollection select: [ :each | each isOdd ].
aCollection inject: 0 into: [ :each :result | each + result ].
Кроме того, они используются для управляющих структур, таких как петли:
[ iterator hasNext ]
whileTrue: [ iterator next ].
1 to: 10 do: [ :each | ... ].
Также условные выражения реализованы с использованием замыканий:
condition
ifTrue: [ do this ]
ifFalse: [ do that ]