在Ruby中防止Nil

时间:2016-05-25 19:56:09

标签: arrays ruby

我正在做一个代码战,你需要在数组中找到正数的总和。除了测试数组为空或所有元素都是负数时,我能够找到解决方案。如何返回0而不是nil?

这是我的解决方案......

def positive_sum(arr)

    arr.select {|x| x > 0}.reduce :+

end

3 个答案:

答案 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)

无需同时执行selectreduce。您可以查看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?selectmap

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