Array#index と String#index [Ruby]
前回のコード [1] を投稿した後でまずかったと思ったのは
pos = input[start..-1].index(pat.first)
とか書いている部分で、これは元の Lisp コードでいう
(let ((pos (position (first pat) input
:start start :test #'equal)))...
というのがやりたかった。
つまり配列 input の中で start 番目の要素以降に最初に pat.first が現れる位置を返すというものなのだけど Array#index [2] には探し始める位置を指定する引数が無いのでこうしたのだ。でも書き方の意図がすぐには分からないし配列を複製するので効率が悪い。あと pos に start を足さないと本来の位置が得られない。自家版 index メソッドを作った方が良かったと思う。
しかし String クラスの index メソッド [3] はどうだっけと思ってリファレンスを見たら、こっちはちゃんと検索開始位置を指定できることが判明。うーん、納得いかないなあ。(これを使う場面で最初に見つかるものだけに興味があるというほうが稀だと思うので基本的に index には開始位置が必須のような気がする)
[1] http://blog.so-net.ne.jp/rainyday/2007-03-18-1
[2] http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=Array#index
[3] http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=String#index
コメント 0