这是我正在尝试做的事情的本质,但“休息”不正确:
needle = nil
haystacks.each do |haystack|
needle = haystack.look_for_needle()
break if needle
end
这虽然更短,但是即使不需要,它也会遍历每个干草堆(至少不查找):
needle = nil
haystacks.each do |haystack|
needle ||= haystack.look_for_needle()
end
这是一个单行但(我相信)它并不懒惰,因此它做了不必要的工作:
needle = hackstacks.map{|h| h.look_for_needle()}.detect{|x| !x.nil?}
我觉得应该有一个单衬,但我不确定它会是:
needle = hackstacks.some_find_each_first_detect_lazy_map_thingee {|h| h.look_for_needle()}
最佳答案
使用 Ruby 2.x lazy enumerators :
needle = haystacks.lazy.map(&:look_for_needle).reject(&:nil?).first
或者:
needle = haystacks.lazy.map(&:look_for_needle).detect { |needle| !needle.nil? }
或者:
needle = haystacks.lazy.map(&:look_for_needle).detect(&:itself)
关于Ruby 习惯用法短路以使用 each 和 map 返回第一个非 nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39214344/