我有一个对象数组,其中一些响应于: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
一样有效的功能?
答案 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库中的Enumerable和facets方法,看看是否找到类似的内容。 Facets包含很多好东西,所以你可能会很幸运。