From: Matthew Kerwin Date: 2013-06-23T15:40:20+09:00 Subject: Re: Confusin with Hash default I can answer the second part, but would have to this a bit about the first: On 23 June 2013 16:17, Love U Ruby wrote: > I was doing some practice and play with Hash default value as written in > the documentation. > > > h = Hash.new([]) > h[:a] << 2 > h[:a] << 3 > h[:a] # => [2, 3] > > Till above is perfect. > > h # => {} > > Why the Hash h is empty hash here? > > h[:b] << 2 > h[:b] # => [2, 3, 2] > > How h[:b] is `[2, 3, 2]` instead of only `[2]` ? Object references. Try it like this: ary = [] hsh = Hash.new(ary) hsh[:x] #=> [] ary << 1 hsh[:x] #=> [1] Every "default" element of `hsh` contains a reference to the `ary` object. Similarly, in your original example, every default element of `h` contained a reference to the unnamed array object. At a _guess_ as to the first part: h = Hash.new([]) # 1. you create an unnamed array object # 2. you create a hash object, whose "default value" is a reference to that array object h[:a] << 2 # 3. h has no key :a, so `h[:a]` returns the default object (the unnamed array) above # 4. you call `<< 2` on that default object; so the unnamed array now has one element h[:a] << 3 # 5. (as above, now it has two elements) h[:a] # => [2, 3] # 6. h still has no key :a, so `h[:a]` returns the default object (the unnamed array) above, which has the two elements you assigned it h # => {} # 7. at no point above did you *add* an element to h; all you did is *get* an element (which didn't exist, so you always got the default), so h remains empty h[:b] << 2 # 8. like above: h has no key :b, so `h[:b]` returns the default object # 9. you call `<< 2` on that object, so now it has 3 elements h[:b] # => [2, 3, 2] # 10. h still has no key :b, so `h[:b]` returns the default object, which is an array with 3 elements -- Matthew Kerwin, B.Sc (CompSci) (Hons) http://matthew.kerwin.net.au/