如何在Ruby中求和
[1, 2, nil, 4]
Run Code Online (Sandbox Code Playgroud)
同
[nil, 2, nil, 4]
Run Code Online (Sandbox Code Playgroud)
并有
[1, 4, nil, 8]
Run Code Online (Sandbox Code Playgroud)
?
例如如下:
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 }
Run Code Online (Sandbox Code Playgroud)
更多的estetic方式是:
a.zip(b).map {|v| v.compact.reduce(:+) }
Run Code Online (Sandbox Code Playgroud)
说明:这里#zip只是用其他值传递的值重构数组,所以第1行将包含每个数组的第1个元素,2个第2个等等.然后#compact,#reduce应用第1行,第2行等各行.#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(:+) }
Run Code Online (Sandbox Code Playgroud)