Ruby Array find_first对象?


135

我在数组文档中缺少什么吗?我有一个数组,其中包含最多一个满足特定条件的对象。我想有效地找到那个对象。我从文档中得到的最好的主意是:

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

但是我不满意有两个原因:

  1. select即使我可以在第一次命中后保释,这也使我遍历了整个数组。
  2. 我需要一行代码(有条件)来压平候选人。

事先知道存在0或1个令人满意的对象,这两个操作都是浪费的。

我想要的是这样的:

array.find_first(block)

它返回nil或该块对其求值为真的第一个对象,从而在该对象处结束遍历。

我必须自己写这个吗?Array中所有其他出色的方法都使我认为它在那里,而我只是没有看到它。

Answers:



97

detect如果要返回第一个值,而块返回true,则使用数组方法

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

OR

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

如果要返回所有值,其中block返回true,则使用 select

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

5
.detect正是我所需要的。但是和那有什么区别.find呢?
Augustin Riedinger 2014年

13
@AugustinRiedinger没有区别,两者相同。detect只是find ruby-doc.org/core-2.1.2/Enumerable.html#method-i-find
Sandip Ransing 2014年

对于某些一致性,我喜欢遵循《 Ruby样式指南》,该指南对人们的查找有所帮助
Paul van Leeuwen

20

猜猜您只是错过了文档中的find方法:

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

8
或者,如果您喜欢打高尔夫球,my_array.find(&:satisfies_condition?)
Andrew Grimm

14

你所需要的对象本身或者你只需要知道,如果有一个对象,它满足。如果是前者,则为:使用查找:

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

否则你可以使用 any?

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

后者在找到满足条件的人时将保释为“ true”。前者将执行相同的操作,但返回对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.