From: Trevor Squires Date: 2006-03-13T10:59:03+09:00 Subject: Re: Array#inject with hash as initial, unexpected error 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 Squires http://somethinglearned.com On 12-Mar-06, at 5:45 PM, Matthew Moss wrote: > (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. >