web-dev-qa-db-ja.com

Ruby Array find_firstオブジェクト?

配列のドキュメントに何か欠けていますか?特定の条件を満たす最大1つのオブジェクトを含む配列があります。そのオブジェクトを効率的に見つけたいです。私がドキュメントから持っている最高のアイデアはこれです:

candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?

しかし、私は2つの理由で不満です:(1)選択すると、最初のヒット後に保釈できたとしても、アレイ全体をトラバースしました、(2)候補を平坦化するためのコード行(条件付き)が必要でした。両方の操作は、0または1の条件を満たすオブジェクトがあることを事前に知っているため無駄です。

私が望むのは次のようなものです:

array.find_first(block)-> nilまたはブロックがtrueと評価される最初のオブジェクトに応答し、そのオブジェクトでの走査を終了します。

これを自分で書く必要がありますか? Arrayの他の優れたメソッドはすべて、私はそれがそこにあると考えさせ、私はそれを見ないだけです。

事前に感謝、ダン

124
Dan Halabe

私はあなたの質問を理解していないか、または Enumerable#find があなたが探していたものです。

182

ブロックがtrueを返す最初の値を返したい場合は、array detectメソッドを使用します

[1,2,3,11,34].detect(&:even?) #=> 2

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2

ブロックがtrueを返すすべての値を返したい場合は、selectを使用します

[1,2,3,11,34].select(&:even?)  #=> [2, 34]
83
Sandip Ransing

ドキュメントのfindメソッドを見逃したと思います:

my_array.find {|e| e.satisfies_condition? }
15
sepp2k

オブジェクト自体が必要ですか、それともisを満たすオブジェクトがあるかどうかを知るだけです。前者の場合、はい:findを使用します。

found_object = my_array.find { |e| e.satisfies_condition? }

それ以外の場合は、any?を使用できます

found_it = my_array.any?  { |e| e.satisfies_condition? }

後者は、条件を満たすものを見つけると「true」で保釈します。前者は同じことを行いますが、オブジェクトを返します。

11
Taryn East