【发布时间】:2014-11-27 16:53:38
【问题描述】:
我如何在 Ruby 中求和
[1, 2, nil, 4]
与
[nil, 2, nil, 4]
并且拥有
[1, 4, nil, 8]
?
【问题讨论】:
我如何在 Ruby 中求和
[1, 2, nil, 4]
与
[nil, 2, nil, 4]
并且拥有
[1, 4, nil, 8]
?
【问题讨论】:
例如如下:
a = [1, 2, nil, 4]
b = [nil, 2, nil, 4]
a.map.with_index {|v,i| (v || b[i]) && v.to_i + b[i].to_i }
更美的方式是:
a.zip(b).map {|v| v.compact.reduce(:+) }
说明:这里#zip 只是用其他传递的值逐个值重构数组,因此第一行将由每个数组的第一个元素、第二个元素中的第二个等组成。然后@ 987654324@,#reduce 应用于第一行、第二行等。#compact 只是删除了nil 值,因此它们不包含在结果中。 #reduce 然后通过 :+ 在 sum(默认为 nil)和 value 之间的运算符为每一行构造一个总和,因此在输出中它导致值的总和 nil 以防空行.
如果我们能得到更通用的方法,让我们对矩阵的行求和。
m = [ [ 1, 2, nil, 4],
[nil, 2, nil, 4] ]
m.shift.zip(*m).map {|v| v.compact.reduce(:+) }
【讨论】:
a.zip(b).map {|x, y| x.nil? ? (y.nil? ? nil : y) : (y.nil? ? x : x + y)}
# => [1, 4, nil, 8]
【讨论】:
这是一种利用nil.to_i => O:
a.zip(b).map { |e,f| [e,f]==[nil,nil] ? nil : e.to_i + f.to_i }
【讨论】: