这是我正在尝试做的事情的本质,但“休息”不正确:

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/

10-09 10:18