rubyco(るびこ)の日記 - コンマ区切りの文字列を逆順に を Squeak の Smalltalk で。
最初、任意の区切り文字を指定してトークンを切り出す #subStrings: を使えばいいのかな…と思ったのですが、これだと最後のカンマはともかく、途中の空欄も消えてしまいます。カンマで区切られたデータの性質を考えると、これではいけません。
'Alice,Bobby,,David,Elmo,' subStrings: #($,)
=> #('Alice' 'Bobby' 'David' 'Elmo')
そこで、#findTokens:keep: を使います。このメソッドは区切り文字(第一パラメータで配列の要素として与えておく…)が、第二パラメータの配列に含まれているとき、それ自体もトークンとして切り出されます。定義のコメントにもありますが、改行を区切り文字として行をトークンとして扱いたいときなどに、最後の空行の有無を区別するのに重宝するらしいです。
'Alice,Bobby,,David,Elmo,' findTokens: #($,) keep: #($,)
=> an OrderedCollection('Alice' ',' 'Bobby' ',' ',' 'David' ',' 'Elmo' ',')
これをリバースして要素を結合すれば目的を達することができそうです。
| string tokens | string := 'Alice,Bobby,,David,Elmo,'. tokens := string findTokens: #($,) keep: #($,). ^ String streamContents: [:ss | tokens reverseDo: [:each | ss nextPutAll: each]]
=> ',Elmo,David,,Bobby,Alice'
できました。が、なんかイマイチ。w