我有一个整数数组。

例如:

array = [123,321,12389]

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

我知道

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

是可行的。


当前回答

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

array.map { |e| e }.sum

其他回答

也允许[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,你可以使用sum from Enumerables。

[1, 2, 3, 4].sum

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

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

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

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

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

array.map { |e| e }.sum
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)