为什么我不能使用| a,b |而不是|(a,b)|在arr.map {|(a,b)|中!b.nil? ? a + b:a}?

时间:2015-09-02 05:13:22

标签: ruby

在下面的代码中,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中意味着什么?

2 个答案:

答案 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]