用于具有可枚举的安全总和的Rails方法

时间:2013-11-29 11:16:37

标签: ruby-on-rails ruby

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值的东西?

3 个答案:

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