Обозначение целочисленной ошибки при вводе - PullRequest
3 голосов
/ 10 февраля 2012

для рубиновых волшебников это должно быть довольно просто.У меня проблема с инъекцией.Это просто:

a = Resource.all
a.inject({ :wood => 0 }) { |res, el| res[:wood] + el.cost(1)[:wood] }
TypeError: can't convert Symbol into Integer

a - это коллекция, и я хотел бы создать сумму всех древесных ресурсов этой коллекции.El.cost (1) [: wood] работает нормально и получает целое число (значение ресурсов).Так что эта часть верна.Кажется, у меня есть проблема с инициализацией моего нового хэша с помощью символа: wood и установкой этого значения в каждой итерации, но я действительно не могу найти проблему.

Есть идеи?

1 Ответ

5 голосов
/ 10 февраля 2012

inject работает следующим образом:

  1. принимает значение инициализации, передает его в лямбду с первым элементом в списке.Используйте результат лямбды в качестве нового аккумулятора
  2. , чтобы передать этот новый аккумулятор в лямбду вместе со следующим элементом в списке.Используйте результат лямбды в качестве нового аккумулятора
  3. И так далее ...

Итак, что вы должны сделать в лямбде:

  1. Возьмите хеш в res.
  2. Измените его.
  3. Верните хеш.

Вы не можете сделать 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, :+) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...