On Dec 5, 2008, at 9:26 AM, Damaris Fuentes wrote:

> I have the following code,where I have a hash whose entries are
> initalized by an empty Array:
>
> h = Hash.new(Array.new(0))

h = Hash.new { |hash, key| hash[key] = Array.new }

> h["a"] << 0
> h["b"] << 6
> h["a"] << 5
> h["b"] << 10
> p h["a"]
> p h["b"]
>
> Both "p" prints the same: [0,6,5,10]
> What am I doing wrong? (I want h["a"] to be [0,5] and h["b"]=[6,10]

If you just pass an object to Hash.new() the exact same object is used  
to initialize all entries.  That's okay with something like a Fixnum  
which will have to be replaced, but not intended with a mutable object  
like Array.  Switching to the block form as I did above forces Ruby to  
run the code each time, getting us a new Array.

James Edward Gray II