我有一个整数数组。
例如:
array = [123,321,12389]
有什么好方法能求出它们的和吗?
我知道
sum = 0
array.each { |a| sum+=a }
是可行的。
我有一个整数数组。
例如:
array = [123,321,12389]
有什么好方法能求出它们的和吗?
我知道
sum = 0
array.each { |a| sum+=a }
是可行的。
当前回答
也允许[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,你可以使用sum:
array.sum
对于ruby < 2.4,你可以使用inject:
array.inject(0, :+)
注意:需要0基本大小写,否则空数组将返回nil:
> [].inject(:+)
nil
> [].inject(0, :+)
0
如果你想打高尔夫,你可以
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)
对于nil值的数组,我们可以压缩,然后注入和 除
a = [1,2,3,4,5,12,23.45,nil,23,nil]
puts a.compact.inject(:+)
试试这个:
array.inject(0){ |sum, x| sum + x }
参见Ruby的可枚举文档
(注意:需要0基本情况,以便在空数组上返回0而不是nil)