Why do I need to use .inject(0) rather than .inject to make this work?

brad picture brad · Mar 22, 2010 · Viewed 8.6k times · Source

I am creating a rails app and have used this code in one of my methods

item_numbers.inject(0) {|sum, i| sum + i.amount}

item_numbers is an array of objects from my item_numbers table. The .amount method that I apply to them looks up the value of an item_number in a separate table and returns it as a BigDecimal object. Obviously the inject method then adds all of the returned i.amount objects and this works just fine.

I am just curious as to why it didn't work when I wrote this statement as

item_numbers.inject {|sum, i| sum + i.amount}

According to my trusty pickaxe book these should be equivalent. Is it because i.amount is a BigDecimal? If so, why does it now work? If not, then why doesn't it work.

Answer

fl00r picture fl00r · Mar 22, 2010

What we can read in API:

If you do not explicitly specify an initial value for memo, then uses the first element of collection is used as the initial value of memo.

So item_numbers[0] will be specified as an initial value - but it is not a number, it is an object. So we have got an error

undefined method `+'.

So we have to specify initial value as 0

item_numbers.inject(0){ |sum, i| sum + i }