Это потому, что вы получаете доступ к i.amount
, а не просто i
.В версии, которая не работает, вы неявно выполняете item_numbers[0] + item_numbers[1].amount + ...
.
Один сокращенный вариант будет item_numbers.map(&:amount).inject(&:+)
, но этот путь может привести к двум итерациям по списку, если map
не делает 't вернуть перечислитель.
Если это не убедило вас, посмотрите, что будет напечатано, если мы определим метод amount
в Fixnum, который печатает значение перед его возвратом:
irb(main):002:1> def amount
irb(main):003:2> puts "My amount is: #{self}"
irb(main):004:2> return self
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> [1,2,3].inject { |sum, i| sum + i.amount }
My amount is: 2
My amount is: 3
=> 6
irb(main):008:0> [1,2,3].inject(0) { |sum, i| sum + i.amount }
My amount is: 1
My amount is: 2
My amount is: 3
=> 6
irb(main):009:0>
Мы можем ясно видеть, что amount
не вызывается для первого элемента, когда начальное значение явно не передается.