我在尝试将字符串中的每个字符切换为下一个(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 - &gt; b g - &gt;等等? 解决
答案 0 :(得分:2)
来自“Smalltalk-80”:
由于参数名称是伪变量名称,因此它们可用于访问变量名称之类的值,但它们的值不能通过赋值来更改。在
的声明spend:for:
的方法中,形式为amount =: amount * taxRate
在语法上是非法的,因为无法重新分配金额的值。
您可以使用collect:
消息创建新集合:
z =: y collect: [:char | (ch asciiValue + 1) asCharacter ].
Character
不响应+
,因此您需要转换为Integer
并返回。请注意,由于String
是集合,因此它们也会响应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 :(得分:1)
试试这个:
x := 'costam'
answer := (x asIntegerArray collect: [ :c | c + 1]) asString.
Transcript show: answer