#findToken:keep:


rubyco(るびこ)の日記 - コンマ区切りの文字列を逆順にSqueakSmalltalk で。


最初、任意の区切り文字を指定してトークンを切り出す #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