数组的总和

时间:2015-05-22 07:48:27

标签: ruby

所以在Python sum([])中会产生0,这非常重要。

而在ruby [].reduce(:+)中,nil当然不是三元运算符,因为:

(my_complicated_mapping).empty? ? 0 : (my_complicated_mapping).reduce(:+) 

将两次致电my_complicated_mapping。因此,显而易见的方法是:

res = my_complicated_mapping
res = (res.empty? ? 0 : res.reduce(:+))

我认为必须有一个更简洁的方法来做到这一点。

4 个答案:

答案 0 :(得分:4)

使用reduce,您可以将初始值指定为第一个参数,例如

my_complicated_mapping.reduce(0, :+)

然后如果列表为空,则会得到0而不是nil。您可以查看使用reduce here的其他替代方式。

或者如果使用reduce的块,它将是:

my_complicated_mapping.reduce(0) { |sum, n| sum + n }

即。带有初始值并提供块的单个参数。

了解为什么 reduce在空数组的情况下返回nil非常重要:如果没有为memo指定显式初始值,那么第一个数组的元素用作备忘录的初始值,当然在空案例中不存在。

答案 1 :(得分:2)

您可以使用to_inil转换为0

[].reduce(:+).to_i
# => 0 

Incase Array包含浮点值,使用to_f可以提供帮助:

[].reduce(:+).to_f
# => 0.0

答案 2 :(得分:1)

为什么不给0作为初始参数?像

my_complicated_mapping.reduce(0, :+)

答案 3 :(得分:0)

您也可以使用inject

my_complicated_mapping.inject(0) { |sum, e| sum + e }