2010-04-12 2 views
2

Я помогал с ответом в this question, и это вызвало мой вопрос.Вычислить сумму объектов для каждого свойства уникального объекта в Ruby

  1. Pie является объектом, который имеет pieces массив, выполненный из PiePiece из объектов.
  2. Каждый PiePiece имеет атрибут flavor

Как создать хэш, который выглядит следующим образом:

# flavor => number of pieces 
{ 
    :cherry => 3 
    :apple => 1 
    :strawberry => 2 
} 

Это работает, но я думаю, что можно было бы улучшить

def inventory 
    hash = {} 
    pieces.each do |p| 
    hash[p.flavor] ||= 0 
    hash[p.flavor] += 1 
    end 
    hash 
end 

Есть идеи?

ответ

5
def inventory 
    Hash[pieces.group_by(&:flavor).map{|f,p| [f, p.size]}] 
end 
+0

Nice. Никогда даже не было известно, что существует группа. – bergyman

+0

Это новое для Ruby 1.8.7. Просто «требуется» backports », если используется 1.8.6. BTW, 'Hash [key_value_pairs]' также является новым для 1.8.7 –

+0

Использование Ruby 1.9, спасибо :) –

Смежные вопросы