如何在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