反轉字串(從右往左讀,而不是從左往右讀)在程式設計中是出乎意料常見的工作。
舉例來說,在生物資訊領域裡,反轉 DNA 或 RNA 字串的序列,對各種分析來說往往很重要,例如找出互補股,或是辨識具有生物學意義的迴文序列。
你的任務是反轉一個給定的字串。
幾個例子:
"stressed"變成"desserts"。"strops"變成"sports"。"racecar"變成"racecar"。雖然字串已經有#reversed和#reverseDo:方法,但你能不能用更底層的字元疊代和串流,自己想辦法完成呢?
為了方便你瀏覽程式碼,Pharo 提供了一個好用的程式碼搜尋工具。按下 Shift-Enter 就能啟用。
注意:我們依循 Exercism 的慣例,把解法命名為 ReverseString,不過更貼近 Smalltalk 風格的名字會是 StringReverser。
談到字串,有些顯而易見的小細節,例如用雙引號寫註解、用單引號寫字串,以及字元的特殊語法(例如用 $x 表示字元「x」),第一次讀到的時候可能會讓你感到困惑,因為這些慣例和其他語言採用的不一樣。
另外還有符號的概念:符號是一種在整個記憶體中獨一無二的字串。也就是說,當它被建構時(通常是在編譯期),會先在記憶體中搜尋是否已經有相同的符號;如果有的話,就只會沿用原本那一個。這麼做的理由不只是節省記憶體,更因為比較符號時能大幅提升速度。
"this is a comment"
'this is a string'
#'this is a symbol'
#thisIsASymbolToo
Smalltalk 程式裡的逗號也非常少,因為逗號在語法上不扮演任何角色。
這就是為什麼陣列字面值不需要逗號,例如
#(1 2 3 4 5)
不過,逗號本身也是個運算子,當你串接兩個字串時就會看到它;例如
'string1', 'string2'
最後,值得一提的是,字串和字元是不同的類別。字串是字元的集合。在疊代字串時,這點可能會讓你措手不及,因為你可能會不小心把字元傳進預期收到字串的方法。請看……
(('hello' at: 2) = $e) inspect.
(('hello' at: 2) = 'e') inspect.
串流適合用來依序讀取和寫入。它們讓程式碼更簡潔,因為不必再自己遞增索引。 串流可以操作任何集合。
stream := WriteStream on: String new.
stream nextPut: $h ; nextPutAll: 'ell' ; nextPut: $o.
stream contents inspect