因此,我正在编写一些代码来计算在多段旅程中各种公共交通车票选项的成本。这可以归结为计算每一段(地图)的成本,并将它们相加在一起(减少aka注入),这很简单:
total = journey.map {|segment| compute segment}.reduce(:+)问题是,有时compute返回nil,因为对于给定的票证,段是不可能的,然后求和操作就会失败。在这种情况下,我想返回那个nil,因为一个糟糕的段意味着整个旅程无效。目前我正在做这个:
fares = journey.map {|segment| compute segment}
total = if fares.include? nil
nil
else
fares.reduce(:+)
end我也可以把它写成简练,但(IMHO)可读性较差:
fares = journey.map {|segment| compute segment}
total = fares.reduce{|sum, n| (sum.nil? or n.nil?) ? nil : sum + n}但一定有更好的方法对吧?
发布于 2014-02-11 12:01:38
我能想到的第一件“更好”的事情是:
journey.map { |s| compute(s) }.reduce(0) do |sum, fee|
break nil unless fee
sum + fee
end更新:只要compute返回nil,它就会返回nil
journey.reduce(0) do |sum, segment|
fee = compute(segment)
break nil unless fee
sum + fee
end发布于 2014-02-11 11:52:26
如下所示:
result = []
journey.take_while { |segment| !(result << compute(segment)).include?(nil) }
total = (result.size == journey.size) ? result.inject(:+) : nil您可以使用Array#take_while方法:
将元素传递给块,直到块返回0或false,然后停止迭代并返回所有先前元素的数组。
https://stackoverflow.com/questions/21701051
复制相似问题