Ruby中的多变量约简
AFAIK减少数组时,我们只能在末尾输出一个变量,如下所示: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
(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
。