Приоритетными правилами Smalltalk являются
первое: одинарные сообщения
второе: двоичные сообщения
третье: ключевые сообщения
последний: слева направо
Этот порядок слева направо можно изменить с помощью скобок, то есть () скобок. Выражение в паре скобок вычисляется первым.
Там, где скобки вложены, сначала оценивается самая внутренняя скобка, а затем направляется наружу к внешней скобке, и, наконец, остатки выражения за скобками.
Из-за сильной тенденции слева направо я часто нахожу полезным читать выражение справа налево.
Так что для [(line := self upTo: Character cr) size = 0] whileTrue.
Подход к нему от конца к началу дает нам следующую интерпретацию.
.
Конец выражения. Эквивалент ;
в C или Java
whileTrue
Что находится слева от него? ]
закрытие блочного объекта.
То есть whileTrue
- это унарное сообщение, отправляемое в блок [
... ]
то есть продолжайте делать этот блок, пока блок оценивается как true
Блок возвращает результат последнего выражения, оцененного в блоке.
Последнее выражение в блоке - size = 0
сравнение. И двоичное сообщение.
size
- это, как правило, одинарное сообщение, отправленное получателю. Итак, мы проверяем size
чего-либо, чтобы увидеть, является ли оно 0
. Если что-то имеет size
из 0
, продолжайте.
Что мы проверяем size
? Выражение непосредственно слева от имени сообщения. Слева от size
есть
(line := self upTo: Character cr)
Это то, что мы хотим знать размером.
Итак, пора положить это выражение под нож.
(line := self upTo: Character cr)
является назначением. line
будет иметь результат
self upTo: Character cr
присвоено ему.
Что находится в правом конце этого выражения? cr
Это унарное сообщение, поэтому имеет наивысший приоритет. На что оно отправлено. то есть, что является получателем для сообщения cr
?
Сразу слева от него находится Character
. Поэтому отправьте классу персонажа сообщение cr
. Это оценивает экземпляр класса Character со значением 13, то есть символ возврата каретки.
Так что теперь мы до self upTo: aCarriageReturn
Если self
- объект, получающий сообщение self upTo: aCarriageReturn
, - не понимает имя сообщения sizeUpto:
, это вызовет исключение.
Так что, если это код из работающей системы, мы можем сделать вывод, что self
должен быть объектом, который понимает sizeUpTo:
В этот момент у меня часто возникает искание искать имя массажа, чтобы увидеть, какие классы имеют сообщение с именем sizeUpto:
в их списке имен сообщений, которые они знают и понимают (т.е. их сообщение протокол ).
(В данном случае это мне не помогло - это не метод ни в одном из классов в моей системе Smalltalk).
Но self
, похоже, просят разобраться со строкой символов, которая содержит (потенциально) много многократных возвратов каретки.
Итак, верните первую часть aCharacterString
до первого возврата каретки.
Если длина aCharacterString от начала до первого возврата каретки равна нулю, продолжайте и сделайте все это снова.
Так что, похоже, мы имеем дело с конкатенацией нескольких строк, оканчивающихся на cr, и обрабатываем каждую по очереди, пока не найдем непустую (кроме возврата каретки), и присваиваем ей line