Ruby数组find_first对象?

我在Array文档中遗漏了什么? 我有一个数组,其中包含多达一个对象满足一定的标准。 我想有效地find这个对象。 我从文档中得到的最好的想法是这样的:

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

但是我不满意的原因有两个:(1)即使我们可以在第一次命中后获得保释,但是select使我遍历整个arrays,(2)我需要一行代码(有条件)来压平候选人。 两种操作都是浪费的,预知有0个或1个令人满意的对象。

我想要的是这样的:

array.find_first(block) – >回答nil或array.find_first(block)的第一个对象为true,结束对象的遍历。

我必须自己写这个吗? Array中的所有其他伟大的方法都让我觉得它在那里,我只是没有看到它。

在此先感谢,丹

要么我不明白你的问题,或Enumerable#find是你正在寻找的东西。

如果你想在block返回true时返回第一个值,使用数组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] 

猜猜你错过了文档中的查找方法:

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

你是否需要这个对象本身,或者你只需​​要知道是否有一个满足的对象。 如果前者则是:使用find:

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

否则你可以使用any?

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

当后者发现一个满足条件的人时,他们将以“真实”保释。 前者会做同样的事情,但返回的对象。