Array#inject with hash as initial, unexpected error


#1

(On Mac OS X 10.4.5, Ruby 1.8.4)

Okay, so:

[1, 2, 3].inject(0) { |s, v| s += v }
=> 6

and:

[1, 2, 3].inject([]) { |a, v| a << v**2 }
=> [1, 4, 9]

but:

[1, 2, 3].inject({}) { |h, v| h[v] = v**2 }
=> NoMethodError: undefined method `[]=’ for 1:Fixnum

What gives?
I’ve tried replacing {} with Hash.new and a couple other variants
without luck.


#2

Hey Matthew,

observe:

irb(main):001:0> [] << 100
=> [100]
irb(main):002:0> {}[:something] = 100
=> 100

The << operator on an array returns the array, while the [] operator
on a hash returns the value you assigned.

And the result of the last statement in your inject block will
replace the value for your memo on each iteration.

So… just make sure the last statement in your inject block is the
memo value you are accumulating:

[1,2,3].inject({}) { |memo, val| memo[val] = val**2; memo}

HTH,
Trevor

Trevor S.
http://somethinglearned.com


#3

Okay, I feel silly now. Thanks for the reminder on basic assignment
protocol. =)