如何在Ruby中对数字进行求和?

我有一个整数数组。

例如:

array = [123,321,12389] 

有没有什么好方法可以得到它们的总和?

我知道

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

会工作。

尝试这个:

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

请参阅Ruby的可枚举文档

(注意: 0基本情况是需要的,所以0将返回一个空数组而不是nil

或者试试Ruby 1.9的方式:

 array.inject(0, :+) 

注意:需要0基本情况,否则空数组将返回nil

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

虽然相当于array.inject(0, :+) ,但随着MapReduce编程模型的兴起,术语“ reduce”正在进入一个更普通的语言。

注入减less折叠积累压缩都是同义的一类折叠函数 。 我认为最重要的是你的代码基础是一致的,但是由于各个社区往往倾向于使用一个字而不是另一个字,所以了解替代scheme仍然是有用的。

为了强调map-reduce的语言,这个版本对这个数组的结果有点宽容。

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

一些额外的相关阅读:

或者(只是为了比较),如果你安装了Rails(实际上只是ActiveSupport):

 require 'activesupport' array.sum 

mokeypatch基类是危险的,现在Ruby 2.4.0已经枚举枚举,所以它不是必须的,也是危险的。 如果你喜欢危险并且使用旧版本的Ruby,你可以在Array类中添加#sum

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

然后做一些有趣的事情:

 [1, 2, 3, 4].sum 

ruby1.8.7的方式如下:

 array.inject(0, &:+) 

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

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

Ruby 2.4.0新增function

您可以使用恰当命名的方法Enumerable#sum 。 它比inject(:+)有很多优点,但是最后还有一些重要的注释。

例子

范围

 (1..100).sum #=> 5050 

数组

 [1, 2, 4, 9, 2, 3].sum #=> 21 [1.9, 6.3, 20.3, 49.2].sum #=> 77.7 

重要的提示

此方法不等同于#inject(:+) 。 例如

 %w(abc).inject(:+) #=> "abc" %w(abc).sum #=> TypeError: String can't be coerced into Integer 

也,

 (1..1000000000).sum #=> 500000000500000000 (execution time: less than 1s) (1..1000000000).inject(:+) #=> 500000000500000000 (execution time: upwards of a minute) 

有关更多信息,请参阅此答案 。

你可以简单地使用:

  example = [1,2,3] example.inject(:+) 

Ruby array.sum / Rails – array.sum[1, 2, 3].sum # => 6

Ruby pre 2.4 – array.inject(:+)array.inject(:+) array.reduce(:+)

*注意: #sum方法对于enumerable是一个新的2.4,所以你现在可以在纯ruby中使用array.sum ,而不仅仅是Rails。

也允许[1,2].sum{|x| x * 2 } == 6 [1,2].sum{|x| x * 2 } == 6

 # http://madeofcode.com/posts/74-ruby-core-extension-array-sum class Array def sum(method = nil, &block) if block_given? raise ArgumentError, "You cannot pass a block and a method!" if method inject(0) { |sum, i| sum + yield(i) } elsif method inject(0) { |sum, i| sum + i.send(method) } else inject(0) { |sum, i| sum + i } end end end 

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 
 array.reduce(:+) 

适用于Ranges …因此,

 (1..10).reduce(:+) returns 55 

你也可以使用recursion

 def sum(array) array.length == 1 ? array.pop() : array.pop() + sum(array) end 

如果你不想破坏,做一个克隆。

如果你觉得高尔夫球,你可以做

 eval([123,321,12389]*?+) 

这将创build一个string“123 + 321 + 12389”,然后使用函数eval来完成总和。 这只是打高尔夫球的目的 ,你不应该使用正确的代码。

你也可以用简单的方法做到这一点

 def sum(numbers) return 0 if numbers.length < 1 result = 0 numbers.each { |num| result += num } result end 

或者你可以试试这个方法:

 def sum arr 0 if arr.empty arr.inject :+ end 

您可以使用.map.sum,如:

 array.map { |e| e }.sum