我有一个整数数组。

例如:

array = [123,321,12389]

有什么好方法能求出它们的和吗?

我知道

sum = 0
array.each { |a| sum+=a }

是可行的。


当前回答

Ruby 2.4.0发布了,它有一个Enumerable#sum方法。所以你可以

array.sum

文档中的例子:

{ 1 => 10, 2 => 20 }.sum {|k, v| k * v }  #=> 50
(1..10).sum                               #=> 55
(1..10).sum {|v| v * 2 }                  #=> 110

其他回答

Ruby 1.8.7的方式如下:

array.inject(0, &:+) 

Ruby 2.4+ / Rails -数组。和即[1,2,3]。Sum # =>

Ruby pre 2.4 - array.inject(:+)或array.reduce(:+)

*注意:#sum方法是2.4中用于枚举的新添加,所以你现在可以使用数组了。sum是纯ruby,而不仅仅是Rails。

只是为了多样性,如果你的数组不是一个数字数组,而是一个具有数字属性的对象数组(例如amount),你也可以这样做:

array.inject(0){|sum,x| sum + x.amount}

方法1:

    [1] pry(main)> [1,2,3,4].sum
    => 10
    [2] pry(main)> [].sum
    => 0
    [3] pry(main)> [1,2,3,5,nil].sum
    TypeError: nil can't be coerced into Integer

方法2:

   [24] pry(main)> [].inject(:+)
   => nil
   [25] pry(main)> [].inject(0, :+)
   => 0
   [4] pry(main)> [1,2,3,4,5].inject(0, :+)
   => 15
   [5] pry(main)> [1,2,3,4,nil].inject(0, :+)
   TypeError: nil can't be coerced into Integer
   from (pry):5:in `+'

方法3:

   [6] pry(main)> [1,2,3].reduce(:+)
   => 6
   [9] pry(main)> [].reduce(:+)
   => nil
   [7] pry(main)> [1,2,nil].reduce(:+)
   TypeError: nil can't be coerced into Integer
   from (pry):7:in `+'

方法4: 当Array包含nil和空值时,默认情况下如果使用上述任何函数reduce、sum、inject,一切都会通过

TypeError: nil不能被强制转换为Integer

你可以通过,

   [16] pry(main)> sum = 0 
   => 0
   [17] pry(main)> [1,2,3,4,nil, ''].each{|a| sum+= a.to_i }
   => [1, 2, 3, 4, nil, ""]
   [18] pry(main)> sum
   => 10

方法6: eval

以字符串形式计算Ruby表达式。

  [26] pry(main)> a = [1,3,4,5]
  => [1, 3, 4, 5]
  [27] pry(main)> eval a.join '+'
  => 13
  [30] pry(main)> a = [1,3,4,5, nil]
  => [1, 3, 4, 5, nil]
  [31] pry(main)> eval a.join '+'
  SyntaxError: (eval):1: syntax error, unexpected end-of-input
  1+3+4+5+
array.reduce(0, :+)

而等价于数组。注入(0,:+),随着MapReduce编程模型的兴起,术语reduce正在进入一个更常见的术语。

注入、还原、折叠、累积和压缩都是一类折叠函数的同义词。我发现代码库之间的一致性是最重要的,但由于各种社区倾向于使用一个词而不是另一个词,因此了解替代词是有用的。

为了强调map-reduce的冗余,这里有一个版本,它对数组中的内容更加宽容。

array.map(&:to_i).reduce(0, :+)

其他相关阅读:

http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject http://en.wikipedia.org/wiki/MapReduce http://en.wikipedia.org/wiki/Fold_ (higher-order_function)