Из «Smalltalk-80»:
Поскольку имена аргументов являются псевдопеременными, их можно использовать для доступа к таким значениям, как имена переменных, но их значения нельзя изменить с помощью присваивания.В методе для spend:for:
оператор в форме
amount =: amount * taxRate
будет синтаксически недопустимым, поскольку значение количества не может быть переназначено.
Вы можете использовать collect:
сообщение о создании новой коллекции:
z =: y collect: [:char | (ch asciiValue + 1) asCharacter ].
Character
s не отвечает на +
, поэтому вам нужно преобразовать в Integer
и обратно.Обратите внимание, что, поскольку String
s являются коллекциями, они также отвечают на collect:
x collect: [:ch | (ch asciiValue + 1) asCharacter ]
Если вы хотите использовать только символы ASCII, возьмите остаток по модулю 128 перед преобразованием обратно в символ.
x collect: [:ch | (ch asciiValue + 1 \\ 128) asCharacter ]
Если вы хотите увеличивать только буквы, а не другие символы, добавьте условное выражение в блок.
x collect: [:ch | ch isLetter
ifTrue: [(ch asciiValue + 1) asCharacter]
ifFalse: [ch] ]
Обратите внимание, что последний блок не обрабатывает буквы в конце непрерывного диапазона (например, $z
, или, если интерпретатор поддерживает расширенный ASCII или Unicode, $<16rD6>
), поскольку точный метод зависит от возможностей системы (в основном, от того, что считать буквой).