解析SmallTalk中的字符串



我要做的是将字符串中的每个字符与下一个字符(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).
].

问题仍然是我如何"增加"字符,如a -> b g -> h等?解决了

From "Smalltalk-80":

由于参数名是伪变量名,它们可以用来访问像变量名一样的值,但是它们的值不能通过赋值来改变。在spend:for:的方法中,格式为

的语句
amount =: amount * taxRate

在语法上是非法的,因为amount的值不能被重新赋值。

您可以使用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>),因为确切的方法取决于系统的能力(基本上,什么被认为是一个字母)。

试试这个:

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

最新更新