Ruby Array find_first对象?

126 ruby arrays performance find

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

candidates = my_array.select { |e| e.satisfies_condition? }
found_it = candidates.first if !candidates.empty?
Run Code Online (Sandbox Code Playgroud)

但我不满意的原因有两个:(1)选择让我遍历整个阵列,即使我们可以在第一次击中后保释,并且(2)我需要一行代码(有条件)来压缩候选人.这两个操作都是浪费,预知有0或1个令人满意的对象.

我想要的是:

select - >回答nil或块评估为true的第一个对象,结束该对象的遍历.

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

提前谢谢,丹

Mla*_*vić 188

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

  • 没问题,我也常常发现ruby文档没有列出所有继承或包含的类和模块的方法. (30认同)
  • 不。我想你明白了。谢谢(和其他人)。我没有看到任何Enumerable方法。那正是我所需要的。抱歉打扰。 (3认同)
  • 更多信息:`[1,2,3,5,2] .find {| n | 放n n == 2}`一旦找到匹配的第一个元素,迭代就会停止。 (3认同)

San*_*ing 87

detect如果要返回块返回true的第一个值,请使用array 方法

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

OR

[1,2,3,11,34].detect{|i| i.even?} #=> 2
Run Code Online (Sandbox Code Playgroud)

如果要返回块返回true的所有值,请使用 select

[1,2,3,11,34].select(&:even?)  #=> [2, 34]
Run Code Online (Sandbox Code Playgroud)

  • @AugustinRiedinger没有区别,两者都相同.detect`只是`find`的别名http://ruby-doc.org/core-2.1.2/Enumerable.html#method-i-find (12认同)
  • `.detect`正是我所需要的.但那与`.find`有什么不同呢? (5认同)
  • 为了保持一致性,我喜欢遵循 ​​[The Ruby Style Guide](https://rubystyle.guide/#map-find-select-reduce-size),这有利于 find (2认同)

sep*_*p2k 18

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

my_array.find {|e| e.satisfies_condition? }
Run Code Online (Sandbox Code Playgroud)

  • 或者如果你喜欢打高尔夫球的代码,`my_array.find(&:satisfies_condition?)` (8认同)

Tar*_*ast 12

你所需要的对象本身,或者你只需要知道,如果有一个对象,它满足.如果前者那么是:使用find:

found_object = my_array.find { |e| e.satisfies_condition? }
Run Code Online (Sandbox Code Playgroud)

否则你可以使用 any?

found_it = my_array.any?  { |e| e.satisfies_condition? }
Run Code Online (Sandbox Code Playgroud)

当后者在找到满足条件的情况下,将以"真实"保释.前者也会这样做,但返回对象.