[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Array#inject with hash as initial, unexpected error

matthew.moss.coder

3/13/2006 1:45:00 AM

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

Trevor Squires

3/13/2006 1:59:00 AM

0

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://somethingl...



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



matthew.moss.coder

3/13/2006 3:59:00 AM

0

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


On 3/12/06, Trevor Squires <trevor@protocool.com> wrote:
> 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}