是否有惯用的ruby/rails方式返回第一个truthy映射值?

Sim*_*mon 9 ruby functional-programming ruby-on-rails

我有一个对象数组,其中一些响应:描述,我想从第一个描述得到描述.我能做到这一点:

objects.detect{|o| o.try(:description)}.description
Run Code Online (Sandbox Code Playgroud)

或这个:

objects.map{|o| o.try(:description)}.detect{|o| o}
Run Code Online (Sandbox Code Playgroud)

但第一个不是DRY(描述在那里两次),第二个是在找到值之前遍历整个数组.ruby标准库中有什么东西,或者Rails对它的扩展,这可以让我做这样的事情:

objects.detect_and_return{|o| o.try(:description)}
Run Code Online (Sandbox Code Playgroud)

我知道我可以轻松地编写它,但标准库足够大,我可能不需要.有没有像我这样的功能detect_and_return

Cas*_*per 6

我没有看到这样的方法,我发现的最接近的是capture_first我在宝石中找到的方法merb-cache.他们似乎偶然发现了同样的问题,并实施了这个:

module Enumerable
  def capture_first
    each do |o|
      return yield(o) || next
    end
    nil
  end
end
Run Code Online (Sandbox Code Playgroud)

您还可以查看Ruby facets库中的ArrayEnumerable方法,看看是否找到类似的东西.Facets包含很多好东西,所以你可能会很幸运.

  • 确实 - 可枚举的#find_yield,又名为Enumerable#map_detect.谢谢 - 我之前没有听说过方面. (2认同)