[英]Parsing string in 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).
].
剩下的問題是如何“增加”字符,如 - > bg - > h等? 解決了
來自“Smalltalk-80”:
由於參數名稱是偽變量名稱,因此它們可用於訪問變量名稱之類的值,但它們的值不能通過賦值來更改。 在
spend:for:
的方法中spend:for:
,表單的聲明amount =: amount * taxRate
因為無法重新分配金額的價值,所以在語法上是非法的。
您可以使用collect:
消息創建新集合:
z =: y collect: [:char | (ch asciiValue + 1) asCharacter ].
Character
s不響應+
,因此您需要轉換為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>
),因為確切的方法取決於系統的功能(基本上,什么被認為是一封信)。
嘗試這個:
x := 'costam'
answer := (x asIntegerArray collect: [ :c | c + 1]) asString.
Transcript show: answer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.