Сокращение нескольких переменных в Ruby - PullRequest
3 голосов
/ 23 марта 2012

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

1 Ответ

7 голосов
/ 23 марта 2012

Объедините несколько результатов в хэш или любой другой подходящий объект:

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
...