Ruby Array find_first object? ?

我在 Array 文档中遗漏了什么吗?我有一个数组,其中包含多达一个对象,满足一定的条件。我希望能有效地找到那个东西。我从医生那里得到的最好的建议是:

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 或块计算结果为 true 的第一个对象,结束该对象的遍历。

我一定要自己写吗?Array 中所有其他伟大的方法都让我觉得它就在那里,只是我没有看到而已。

137990 次浏览

要么我不明白你的问题,要么 数不胜数就是你要找的东西。

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

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? }

当后者发现一个满足条件时,它将以“真实”作为保释条件。 前者将执行同样的操作,但返回对象。

如果要返回块返回 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]