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?
我没有看到这样的方法,我发现的最接近的是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库中的Array和Enumerable方法,看看是否找到类似的东西.Facets包含很多好东西,所以你可能会很幸运.