在下面的代码中,arr意味着是一个二维数组,例如[[1,2],[4,5]]
。它计算子数组元素的总和。子数组只能有一个元素,在这种情况下,sum只是一个元素。
def compute(arr)
return nil unless arr
arr.map { |(a, b)| !b.nil? ? a + b : a }
end
为什么代码必须是|(a, b)|
而不是|a,b|
?
(a,b)
在Ruby中意味着什么?
答案 0 :(得分:5)
你也可以使用|a,b|
,它与|(a,b)|
没什么不同。
你也可以重写下面的代码,它没有子数组的元素数限制:
arr.map { |a| a.inject{ |sum,x| sum + x } }
甚至:
arr.map { |a| a.inject(:+) }
答案 1 :(得分:2)
如果arr
是数组,则两者都是等效的:
arr = [[1, 2], [4, 5]]
arr.map { |a, b| [a, b] } #=> [[1, 2], [4, 5]]
arr.map { |(a, b)| [a, b] } #=> [[1, 2], [4, 5]]
这是因为一次只用一个参数调用块:子数组。类似的东西:
yield [1, 2]
yield [4, 5]
如果产生多个参数,则会更改。例如,each_with_index
使用两个参数调用块:项(即子数组)及其索引。类似的东西:
yield [1, 2], 0
yield [4, 5], 1
差别很明显:
enum = [[1, 2], [4, 5]].each_with_index
enum.map { |a, b| [a, b] } #=> [[[1, 2], 0], [[4, 5], 1]]
enum.map { |(a, b)| [a, b] } #=> [[1, 2], [4, 5]]
请注意,省略括号还允许您设置默认参数值:
arr = [[1, 2], [4]]
arr.map { |a, b = 0| a + b } #=> [3, 4]