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 <lists / ruby-forum.com> 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/