配列内の項目を検索し、次の項目の値を返す必要があります。例:
a = ['abc.df','-f','test.h']
i = a.find_index{|x| x=~/-f/}
puts a[i+1]
インデックスを操作する以外に良い方法はありますか?
配列内の項目を検索し、次の項目の値を返す必要があります。例:
a = ['abc.df','-f','test.h']
i = a.find_index{|x| x=~/-f/}
puts a[i+1]
インデックスを操作する以外に良い方法はありますか?
従来の機能的アプローチでは、インデックスを使用しません(xs.each_cons(2)
-> xsのペアワイズの組み合わせ)。
xs = ['abc.df', '-f', 'test.h']
(xs.each_cons(2).detect { |x, y| x =~ /-f/ } || []).last
#=> "test.h"
Enumerable#map_detectを使用すると、少し単純化されます。
xs.each_cons(2).map_detect { |x, y| y if x =~ /-f/ }
#=> "test.h"
のようなものが存在しない理由array.find{something}.next
は、それがリンクされたリストではなく配列であるためです。各アイテムはそれ自体の価値です。「私の次のアイテム」という概念はありません。
@tokland は、連続するアイテムの各ペアで配列を反復処理することにより、適切なソリューションを提供します。これにより、最初のアイテムが一致したときに、2 番目のアイテムが手元にあるようになります。確かに、機能的なスタイルには強い議論があります。ただし、あなたのバージョンは短く、あなたのバージョンも一目でより迅速かつ簡単に理解できると思います。
問題があなたがそれを頻繁に使用していて、何かよりクリーンで要点が欲しいということである場合は、もちろん、シングルトンメソッドとして次のように追加できますa
。
def a.find_after(&test)
self[find_index(&test).next]
end
それで
a.find_after{|x| x=~/-f/}
最初の一致の後に次のアイテムを見つける明確な方法です。
そうは言っても、@ BenjaminCoxは、あなたの実際の目標と思われるものについて最も適切に指摘していると思います. コマンド ライン オプションを解析している場合、それをうまく処理するライブラリがあります。
他の人がコメントしているように、インデックスを操作するソリューションは問題ありません。を使用Enumerable#drop_while
して、マッチから配列を取得し、その 2 番目の要素を取得できます。
a = ['abc.df','-f','test.h']
f_arg = a.drop_while { |e| e !~ /-f/ }[1]