3
>> [1, 2, 3, 4, 5].any? {|n| n % 3 == 0}
=> true

アイテムが一致したかどうかだけでなく、どのアイテムが一致したかを知りたい場合はどうすればよいですか? 私は短絡ソリューション (一致が見つかるとすぐに反復を停止するもの) にのみ興味があります。

私は次のことができることを知っていますが、Ruby は初めてなので、他のオプションを学びたいと思っています。

>> match = nil
=> nil
>> [1, 2, 3, 4, 5].each do |n|
..   if n % 3 == 0
..     match = n
..     break
..   end
.. end
=> nil
>> match
=> 3
4

3 に答える 3

6

あなたはこれを探していますか:

[1, 2, 3, 4, 5].find {|n| n % 3 == 0} # => 3

ドキュメントから:

列挙型の各エントリをブロックに渡します。block が false でない最初のものを返します。

したがって、これは「短絡」要件も満たします。もう 1 つの、おそらくあまり一般的ではない のエイリアスEnumerable#findは でEnumerable#detect、まったく同じように機能します。

于 2011-10-12T04:56:43.757 に答える
5

ブロックが真である最初の要素が必要な場合は、次を使用しますdetect

[1, 2, 3, 4, 5].detect {|n| n % 3 == 0}
# => 3

一致する最初の要素のインデックスが必要な場合は、次を使用しfind_indexます。

[1, 2, 3, 4, 5].find_index {|n| n % 3 == 0}
# => 2

一致するすべての要素が必要な場合は、次を使用しますselect(これは短絡しません)。

[1, 2, 3, 4, 5, 6].select {|n| n % 3 == 0}
# => [3, 6]
于 2011-10-12T04:59:48.650 に答える
3

短絡動作が必要な場合は、選択ではなく Enumerable#find が必要です

ruby-1.9.2-p136 :004 > [1, 2, 3, 4, 5, 6].find  {|n| n % 3 == 0}
 => 3 
ruby-1.9.2-p136 :005 > [1, 2, 3, 4, 5, 6].select  {|n| n % 3 == 0}
 => [3, 6] 
于 2011-10-12T04:57:21.463 に答える