inject
работает следующим образом:
- принимает значение инициализации, передает его в лямбду с первым элементом в списке.Используйте результат лямбды в качестве нового аккумулятора
- , чтобы передать этот новый аккумулятор в лямбду вместе со следующим элементом в списке.Используйте результат лямбды в качестве нового аккумулятора
- И так далее ...
Итак, что вы должны сделать в лямбде:
- Возьмите хеш в
res
. - Измените его.
- Верните хеш.
Вы не можете сделать 2 и 3, поэтому этот кодне работаетПопробуйте следующее:
a.inject({ :wood => 0 }) { |res, el| res[:wood] += el.cost(1)[:wood]; res }
Это, однако, немного избыточно.Вы можете легко накопить целые числа, а затем создать хеш:
{ :wood => a.map { |el| el.cost(1)[:wood] }.reduce(0, :+) }