Rails提供了一个非常方便的结构,允许对数组元素求和。
foo = [1,2,3]
foo.sum
=> 6
但是,您并不总是确定您的数组是否具有非零值,在这种情况下,上述方法将失败
bar = [1,2,nil,4]
bar.sum
TypeError: nil can't be coerced into Fixnum
有没有像safe_sum那样忽略nil值的东西?
答案 0 :(得分:3)
您可以使用Array#compact
方法:
bar.compact.sum
# => 7
或者,您可以使用Enumerable#inject
:
bar.inject(0) { |sum, el| el ? sum + el : sum }
# => 7
虽然第一种方法看起来更漂亮,更方便。
答案 1 :(得分:1)
你甚至可以使用紧凑型
bar.compact.sum
答案 2 :(得分:0)
module Enumerable
def safe_sum(identity = 0, &block)
if block_given?
map(&block).compact.sum(identity)
else
reduce { |sum, element| sum + element.to_f } || identity
end
end
end