我有一个整数数组。

例如︰

array = [123,321,12389]

有任何好的办法来获取它们的总和吗?

我知道那件事

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

将起作用。

2009-10-08 16:04:57
问题评论:

回答:

试试这个︰

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

请参见 Ruby 的可枚举文档

(注︰ 0基用例需要会返回一个空数组,而不是nil 0)

jorney 的array.inject(:+)则更为有效。

array.inject(:+)似乎 Ruby 1.8.6 的异常会导致麻烦"LocalJumpError︰ 给出任何阻塞"可能突然出现。

在 rails 中array.sum可能会使您的数组值的总和。

在大多数情况下,我更愿意使用reduce,即inject的别名 (在array.reduce( :+ )).

@Boris Rubycop 还,将提醒您使用inject,而不是reduce.

或者尝试的 Ruby 1.9 方式︰

array.inject(0, :+)

注意︰ 0基用例需要否则nil,将返回空数组︰

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

此外配合 1.8.7

如何使用这种方式来计算对象的属性的总和。我想要和 product1.price + product2.price [产品 1、 product2] 我数组。它可能使用了 array.inject(:+)?

您可以使用一个类似的技巧与映射方法︰ array.map(&:price).inject(:+)

array.map(&:price).inject(0, :+)是有点更安全。这样可确保,如果您有一个空的列表获取0而不是.

使用 array.map(...)。inject(...) 是低效的您会循环访问所有数据两次。请尝试array.inject(0) { |sum, product| sum += product.price }

array.reduce(0, :+)

虽然相当于array.inject(0, :+)减少进入MapReduce 编程模型的发展更为常见 vernacular 术语.

注入降低折叠积累,并压缩折叠函数的一类为所有同义词。我找到一致性整个基本代码最重要的是,但由于各种社区往往首选,而另一个单词,却有助于了解备选方案。

若要强调地图减少措辞,这是在该数组中的什么结束得有点更多 forgiving 的版本。

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

一些其他的相关阅读︰

我同意,reduce告诉我多个函数的用途,但injectdoes 听得酷。

这应该是顶部的答案-极好的背景信息

同意与最后一条批注,您赐予我的最好的回答。

答得好。我学到了很多

我会做一个意见是,reduce并作为高阶函数map早 MapReduce。灵感会运行另一种方法。和 MapReduce 意义上讲,它的稍有不同的操作比一个简单的功能降低,具有影响方式不同的计算机进行通信。

或者 (只用于相比较),如果有轨道安装 (实际上只是 ActiveSupport):

require 'activesupport'
array.sum

默认情况下,较新版本的 activesupport 实际上不加载所有的扩展。将想要或者需要不仅仅是将之和模块︰require 'active_support/core_ext/enumerable.rb',或要求所有活动的支持︰require 'active_support/all'更多关于此处︰ API 文档

更别提都该activesupport巨大依赖项拖动到想从array.inject(:+)array.sum的项目.

Nitpick 本来良好的注释为︰ 它应该是不带.rb后缀中,require 'active_support/core_ext/enumerable'由于隐式地添加。

#sum添加到Array的类︰

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

然后有趣的类似的东西︰

[1, 2, 3, 4].sum
内容来源于Stack Overflow How to sum array of numbers in Ruby?
请输入您的翻译

How to sum array of numbers in Ruby?

确认取消