我有一个整数数组。

例如:

array = [123,321,12389]

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

我知道

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

是可行的。


当前回答

对于ruby >= 2.4,你可以使用sum:

array.sum

对于ruby < 2.4,你可以使用inject:

array.inject(0, :+)

注意:需要0基本大小写,否则空数组将返回nil:

> [].inject(:+)
nil
> [].inject(0, :+)
0

其他回答

试试这个:

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

参见Ruby的可枚举文档

(注意:需要0基本情况,以便在空数组上返回0而不是nil)

对于Ruby >=2.4.0,你可以使用sum from Enumerables。

[1, 2, 3, 4].sum

mokeypatch基类是很危险的。如果你喜欢危险并且使用旧版本的Ruby,你可以在Array类中添加#sum:

class Array
  def sum
    inject(0) { |sum, x| sum + x }
  end
end

你可以像这样使用。map和。sum:

array.map { |e| e }.sum

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

方法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+