2012-03-23 57 views
3

AFAIK减少数组时,我们只能输出一次在最后像这样的变量:减少多个变量在Ruby中

(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 

回答

7

骨料多个结果或者任何其它合适的物体:

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 
+3

哟你也可以切换到'each_with_object',而不必担心块的返回值(但你必须切换块的参数顺序)。 – 2012-03-23 05:30:29

+2

@ muistooshort我真的不明白为什么这两种方法的参数顺序不同,看起来确实很傻。我一直在困惑这两个人。 – 2012-03-23 05:32:56

+1

@AndrewMarshall:告诉我这件事。 AFAIK'reduce'命令是注入/减少的标准,'each_with_object'与'each_with_index'匹配。另一方面,'each_with_X'的顺序确实与名称匹配(我第一次注意到它)。 – 2012-03-23 05:45:23