Ответ 1
&:age
означает, что метод group_by
должен вызывать метод age
для элементов, чтобы получить группу по данным. Этот метод age
не определен для элементов, которые являются хешами.
Это должно работать:
array.group_by { |d| d[:age] }
У меня есть этот массив хэшей:
- :name: Ben
:age: 18
- :name: David
:age: 19
- :name: Sam
:age: 18
Мне нужно сгруппировать их с помощью age
, поэтому они заканчиваются так:
18:
- :name: Ben
:age: 18
- :name: Sam
:age: 18
19:
- :name: David
:age: 19
Я пробовал делать это так:
array = array.group_by &:age
но я получаю эту ошибку:
NoMethodError (undefined method `age' for {:name=>"Ben", :age=>18}:Hash):
Что я делаю неправильно? Я использую Rails 3.0.1 и Ruby 1.9.2
&:age
означает, что метод group_by
должен вызывать метод age
для элементов, чтобы получить группу по данным. Этот метод age
не определен для элементов, которые являются хешами.
Это должно работать:
array.group_by { |d| d[:age] }
out = {}
array_of_hashes.each do |a_hash|
out[a_hash[:age]] ||= []
out[a_hash[:age]] << a_hash
end
или
array.group_by {|item| item[:age]}
Как указывали другие, метод ruby Symbol#to_proc
вызывается и вызывает метод age
для каждого хэша в массиве. Проблема здесь в том, что хеши не реагируют на метод age
.
Теперь мы можем определить один для класса Hash, но мы, вероятно, не хотим его для каждого экземпляра хэша в программе. Вместо этого мы можем просто определить метод age
для каждого хэша в массиве следующим образом:
array.each do |hash|
class << hash
def age
self[:age]
end
end
end
И тогда мы можем использовать group_by
так же, как вы были раньше:
array = array.group_by &:age