所以在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(:+))
我认为必须有一个更简洁的方法来做到这一点。
答案 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_i
将nil
转换为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 }