From: Eric Russell Date: 2010-01-06T14:55:29+09:00 Subject: Re: being very confused about this hash 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 > > >