首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Map-reduce子句用于处理nils

Map-reduce子句用于处理nils
EN

Stack Overflow用户
提问于 2014-02-11 11:51:12
回答 2查看 121关注 0票数 0

因此,我正在编写一些代码来计算在多段旅程中各种公共交通车票选项的成本。这可以归结为计算每一段(地图)的成本,并将它们相加在一起(减少aka注入),这很简单:

代码语言:javascript
复制
total = journey.map {|segment| compute segment}.reduce(:+)

问题是,有时compute返回nil,因为对于给定的票证,段是不可能的,然后求和操作就会失败。在这种情况下,我想返回那个nil,因为一个糟糕的段意味着整个旅程无效。目前我正在做这个:

代码语言:javascript
复制
fares = journey.map {|segment| compute segment}
total = if fares.include? nil
  nil
else
  fares.reduce(:+)
end

我也可以把它写成简练,但(IMHO)可读性较差:

代码语言:javascript
复制
fares = journey.map {|segment| compute segment}
total = fares.reduce{|sum, n| (sum.nil? or n.nil?) ? nil : sum + n}

但一定有更好的方法对吧?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-11 12:01:38

我能想到的第一件“更好”的事情是:

代码语言:javascript
复制
journey.map { |s| compute(s) }.reduce(0) do |sum, fee| 
  break nil unless fee
  sum + fee
end

更新:只要compute返回nil,它就会返回nil

代码语言:javascript
复制
journey.reduce(0) do |sum, segment|
  fee = compute(segment)
  break nil unless fee
  sum + fee
end
票数 1
EN

Stack Overflow用户

发布于 2014-02-11 11:52:26

如下所示:

代码语言:javascript
复制
result = []
journey.take_while { |segment| !(result << compute(segment)).include?(nil) }
total = (result.size == journey.size)  ? result.inject(:+) : nil

您可以使用Array#take_while方法:

将元素传递给块,直到块返回0或false,然后停止迭代并返回所有先前元素的数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21701051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档