Разбор строки в SmallTalk - PullRequest
       1

Разбор строки в SmallTalk

4 голосов
/ 07 ноября 2011

я пытаюсь переключить каждый символ в строке на один следующий (a-> b, y -> z и т. Д.).Хотя я не уверен, как мне это сделать в Smalltalk и попытался объединить так:

x := 'costam'.
y := x asArray.
y do: [:charr | charr := charr + 1. ].
y do: [:char | Transcript show: char printString; cr].

Что я делаю: перебираю массив и увеличиваю каждый символ ... хотя это не работает.Я получаю ошибку: попытка сохранить в аргумент.Как мне обойти это и сделать это правильно?

Теперь у меня есть что-то вроде этого:

x := 'costam'.
y := x asArray.
b := y at: 2.


n := 1.
m := 5.

[ n < m ] whileTrue: [
n := n + 1.
y at: n put: 'a'.
Transcript show: (y printString).
].

Остается проблема, как мне «увеличить» символы, такие как -> bg-> ч и т.д?РЕШИТЬ

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Из «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>), поскольку точный метод зависит от возможностей системы (в основном, от того, что считать буквой).

1 голос
/ 07 ноября 2011

Попробуйте это:

x := 'costam'
answer := (x asIntegerArray collect: [ :c | c + 1]) asString.
Transcript show: answer
...