Forum: Ruby Array#inject with hash as initial, unexpected error

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Matthew M. (Guest)
on 2006-03-13 03:46
(Received via mailing list)
(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.
Trevor S. (Guest)
on 2006-03-13 04:01
(Received via mailing list)
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
Matthew M. (Guest)
on 2006-03-13 05:59
(Received via mailing list)
Okay, I feel silly now.  Thanks for the reminder on basic assignment
protocol.  =)
This topic is locked and can not be replied to.