# Array#inject with hash as initial, unexpected error

**URL:** <https://www.ruby-forum.com/t/array-inject-with-hash-as-initial-unexpected-error/80178>\
**Category:** Ruby\
**Created:** [March 13, 2006, 2:46am UTC](https://www.ruby-forum.com/t/array-inject-with-hash-as-initial-unexpected-error/80178 "2006-03-13T02:46:18Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![mansfiem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/fbc32d/32.png) [@mansfiem](https://www.ruby-forum.com/u/mansfiem)\
**Post date:** [March 13, 2006, 2:46am UTC](https://www.ruby-forum.com/t/array-inject-with-hash-as-initial-unexpected-error/80178/1 "2006-03-13T02:46:18Z")

</div>

(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.

---

<div class="post-metadata">

**Author:** ![mansfiem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/fbc32d/32.png) [@mansfiem](https://www.ruby-forum.com/u/mansfiem)\
**Post date:** [March 13, 2006, 3:01am UTC](https://www.ruby-forum.com/t/array-inject-with-hash-as-initial-unexpected-error/80178/2 "2006-03-13T03:01:22Z")

</div>

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](http://somethinglearned.com)

---

<div class="post-metadata">

**Author:** ![mansfiem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/fbc32d/32.png) [@mansfiem](https://www.ruby-forum.com/u/mansfiem)\
**Post date:** [March 13, 2006, 4:59am UTC](https://www.ruby-forum.com/t/array-inject-with-hash-as-initial-unexpected-error/80178/3 "2006-03-13T04:59:38Z")

</div>

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