On Fri, Sep 19, 2008 at 12:40 PM, Glenn <glenn_ritz / yahoo.com> wrote:
> Hi,
>
> Can anyone explain why hash_of_indexes1 in the code below works, but hash_of_index2 doesn't?  (I got the first method as a response to a previous post.)

snip

> class Array
>   def hash_of_indexes1
>     h = Hash.new
>     each_with_index { |e, i| h[e.to_f] = Array( h[e.to_f] ) << i }
>     h
>   end
>
>   def hash_of_indexes2
>     h = Hash.new([])
>     each_with_index { |e, i| h[e.to_f] = h[e.to_f] << i }
>     h
>   end
> end
>
> [1, 2, 2, 3].hash_of_indexes1.inspect ## --> returns {1.0=>[0], 3.0=>[3], 2.0=>[1, 2]}
>
> [1, 2, 2, 3].hash_of_indexes2.inspect ## --> returns {1.0=>[0, 1, 2, 3], 3.0=>[0, 1, 2, 3], 2.0=>[0, 1, 2, 3]}

With hash_of_indexes2, the array assigned to the each hash key is the
same Array object.  You can tell this by comparing their __id__ tags
(apologies for lazy style)...

a = 1,2,3,4
b = 1,2,3,4

a == b
=> true
a.__id__ == b.__id__
=> true

a = Array([1,2,3,4])
b = Array([1,2,3,4])

a == b
=> true
a.__id__ == b.__id__
=> false

Todd