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

时间:2011-08-03 12:20:08

标签: ruby-on-rails ruby functional-programming

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

objects.detect{|o| o.try(:description)}.description

或者这个:

objects.map{|o| o.try(:description)}.detect{|o| o}

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

objects.detect_and_return{|o| o.try(:description)}

我知道我可以轻松地编写它,但标准库足够大,我可能不需要。是否有一个像detect_and_return一样有效的功能?

1 个答案:

答案 0 :(得分:6)

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

module Enumerable
  def capture_first
    each do |o|
      return yield(o) || next
    end
    nil
  end
end

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