Rubyコーディングあれこれ (初めての方むけ: .scanをどう使う?)
本地震の予測マップ・プログラムはRubyで書かれていますが、以前から初めての方むけにコーディングテクのようなモノをまとめておければ、と考えていました。 そこで思い付くままにまとめてみよう、と考えております。
今回は、.scanの使い方です。 (短くまとめます)
.scanはストリングから所望の文字列を抽出して配列を作成するものです。
例えば言語入力列がストリング"str"で与えられ、そのから"abc.def.efg"や"xyz"といった文字列を抽出して、例えば配列result_arrayに格納します。 key wordでも勿論構いません。
result_array = str.scan(/((\w+\.)+\w+)|(\w+)/).flatten # 抽出する文字列は各々()で囲う
# ^^^flattenが必要
result_array.delete(nil) # 結果にはnilが入るので、nilを消去します。
またこの例の場合は"abc."といった中間"."で区切られたストリングも抽出されてしまうので、これも排除します。
result_array.each_with_index do |i,x| result_array[x] = nil if i =~ /\.$/ end
result_arrtay.delete(nil)
入力言語ストリングにどんなデータなりkey wordがどのような順番で入っているかが一発で分かります。
とまあこういう事なのですが、実はもっと根幹的な問題がありまして。
それは言語入力処理アプリを作る場合、どこまでストリングで持ち、どこから配列にするのが有利か?
もしくはすべてストリングで処理した方が有利か?
という問題です。
言語入力ですから入力はストリングです。
何しろストリングの強みは:
・正規表現が使える(そしてこれが早い!)
・StringScannerが使える(これも正規表現アプリですが、何しろ便利です)
にあります。
一方、配列の強みはアドレス管理でデータが扱える事でしょう。
結局、入力言語のアプリが何かによって変わってくるのではないか、と思っています。 例えばシミュレータに繋ぐような場合、どこかで配列(テーブル)表現にする必要がありますので、エイヤッと腹を決めてあるポイントからは配列で持ちます。 一方、言語を入力して別言語に変換するような場合ですと、ストリングのままの方が良いかもしれません。
という事ですので、.scanがあるからといって、やたら早い段階からストリングを配列にするのは危険です。 全体設計が重要で、その上で.scanを使うかどうか、使うとしたらどのタイミングかをお決めになれば良い、と思います。
以上です。