2012-03-23 111 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