I believe that keys is returning empty because the hash is empty.  If  
I remember correctly, the default hash element mechanism doesn't  
create the element, just returns the default element when referenced.

So hash['abc'] returns our specific default instance which then gets a  
3 added to it.  That's why all future defaults get the [3]...its the  
identical instance.  But no actually elements are added to the hash.

On Jan 5, 2010, at 11:02 PM, Bill Kelly wrote:

> Ruby Newbee wrote:
>>
>> irb(main):039:0> hash = Hash.new []
>> => {}
>> irb(main):040:0> hash['abc'] << 3
>> => [3]
>> irb(main):041:0> hash.keys
>> => []
>> irb(main):042:0> hash['def']
>> => [3]
>>
>>
>> Since I have created a key/value pair with hash['abc'] << 3, why
>> hash.keys show nothing?
>> And, why hash['abc'] << 3 changed the hash's default value (which
>> should be an empty array)?
>
> I'm not sure why hash.keys was empty.
>
> But with regard to the default value, we are providing an
> object (a specific instance of the Array class) to be used
> as the default.
>
> We can illustrate this by asking Ruby to show us the object_id
> of the default object:
>
> irb(main):001:0> ary = []
> => []
> irb(main):002:0> ary.object_id
> => 20919800
> irb(main):003:0> h = Hash.new ary
> => {}
> irb(main):004:0> h['foo'].object_id
> => 20919800
> irb(main):005:0> h['bar'].object_id
> => 20919800
>
> So we can see the object_id of the default object is indeed
> the same object_id of the array we provided to Hash.new.
>
>  *  *  *
>
> We can instead provide a block to Hash.new which allows us
> to create a _new_ unique object (instance of Array) whenever
> a new default value is needed:
>
> irb(main):001:0> h = Hash.new {|h,k| h[k] = []}
> => {}
> irb(main):002:0> h['abc'] << 3
> => [3]
> irb(main):003:0> h.keys
> => ["abc"]
> irb(main):004:0> h['def']
> => []
>
>
> Regards,
>
> Bill
>
>
>