我正在做一个代码战,你需要在数组中找到正数的总和。除了测试数组为空或所有元素都是负数时,我能够找到解决方案。如何返回0而不是nil?
这是我的解决方案......
def positive_sum(arr)
arr.select {|x| x > 0}.reduce :+
end
答案 0 :(得分:4)
您的解决方案非常优雅,因为它捕获了您想要实现的内容并且非常易读。
缺少的一个部分是你可以为reduce调用定义一个起始值,并将操作作为一个块传递(这是更常见的样式)。传递起始值时,它将在块的第一次调用时设置为sum
。如果省略此值,sum
将设置为数组的第一个值,x
将设置为第二个值。
因此,完整代码可能如下所示:
arr.select { |x| x > 0 }.reduce(0, &:+)
这是
的缩写形式arr.select { |x| x > 0 }.reduce(0) { |sum, x| sum + x }
答案 1 :(得分:3)
无需同时执行select
和reduce
。您可以查看x
区块中reduce
的值:
def positive_sum(arr)
arr.reduce(0) do |sum, x|
if x > 0
sum + x
else
sum
end
end
end
positive_sum([10, -3, 20, -8])
# => 30
positive_sum([])
# => 0
positive_sum([-1, -5])
# => 0
当然,如果您愿意,可以将其设为oneliner:
def positive_sum(arr)
arr.reduce(0) {|sum, x| x > 0 ? sum + x : sum }
end
答案 2 :(得分:1)
在ruby 2.3.0中,引入了方法positive?,select
和map
。
def positive_sum(array)
return 0 if array.nil? || array.empty?
array.select(&:positive?).inject(0) { |sum, num| sum + num }
end
如果你没有使用Ruby 2.3.0+,你可以使用这个
def positive_sum(array)
return 0 if array.nil? || array.empty?
array.inject(0) { |sum, num| num > 0 ? sum + num : sum }
end