我有一个整数数组。

例如:

array = [123,321,12389]

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

我知道

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

是可行的。


当前回答

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)

其他回答

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

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

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

如果你想打高尔夫,你可以

eval [123,321,12389]*?+

这将创建一个字符串“123+321+12389”,然后使用函数eval进行求和。这只是为了打高尔夫球,你不应该在正确的代码中使用它。

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)

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

array.sum

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

array.inject(0, :+)

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

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