簡體   English   中英

在SmallTalk中解析字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM