Мал*_*евъ 5

例如如下:

 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)