Ruby中的多变量约简

Ruby中的多变量约简,ruby,reduce,enumerable,Ruby,Reduce,Enumerable,AFAIK减少数组时,我们只能在末尾输出一个变量,如下所示: (0..10).reduce(0) do |sum, value| sum + value end 如果我有一个散列对象数组,我可以减少数组并输出多个变量,比如: ({:grade => 100, :sex => 'female'}, {:grade => 90, :sex => 'male'}).reduce(0, 0, 0) do |sum_of_grades, sum_of_male, sum_of

AFAIK减少数组时,我们只能在末尾输出一个变量,如下所示:

(0..10).reduce(0) do |sum, value|
  sum + value
end
如果我有一个散列对象数组,我可以减少数组并输出多个变量,比如:

({:grade => 100, :sex => 'female'}, {:grade => 90, :sex => 'male'}).reduce(0, 0, 0) do |sum_of_grades, sum_of_male, sum_of_female, value|
  sum_of_grades = sum_of_grades + value[:grade]
  sum_of_male += 1 if value[:sex] == 'male'
  sum_of_female +=1 if value[:sex] == 'female
end

将多个结果聚合到哈希或任何其他合适的对象中:

a.reduce({:sum_of_grades => 0, :sum_of_male => 0, :sum_of_female => 0}) do |result, value|
     result[:sum_of_grades] += value[:grade]
     result[:sum_of_male] += 1 if value[:sex] == 'male'
     result[:sum_of_female] += 1 if value[:sex] == 'female'
     result
end

您也可以切换到
每个带有\u对象的\u
,而不必担心块的返回值(但您必须切换块的参数顺序)。@muistooshort我真的不明白为什么这两个方法的参数顺序不同,看起来真的很愚蠢。“我总是把这两个搞混了。”@AndrewMarshall:告诉我吧。如果
reduce
顺序是注入/还原的标准顺序,
每个带有\u对象的\u
匹配
每个带有\u索引的\u
。从好的方面来看,
每个_和_X的顺序确实与名称匹配(我实际上是第一次注意到了这一点)。@AndrewMarshall@muistoshort我倾向于做一些类似于
a.map{e | e.fetch(:grade)}.inject(:+)
,即保持映射和还原分开。请注意,如果
a
中没有元素,我的代码片段将返回
nil