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.
81d609425e306219d54d793a0ad98bce?d=identicon&s=25 Matthew Moss (Guest)
on 2006-03-13 02: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.
27c170f482104299af279902be0a9c26?d=identicon&s=25 Trevor Squires (Guest)
on 2006-03-13 03: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 Squires
http://somethinglearned.com
81d609425e306219d54d793a0ad98bce?d=identicon&s=25 Matthew Moss (Guest)
on 2006-03-13 04: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.