h = Hash.new{|h,k| h[k] = [] }
h[0].push(99)
This will result in {0=>[99]}
When
Hash.new([])
is used, a single object is used as the default value (i.e. value to be returned when a hash key
h[0]
does not return anything), in this case one array.
So when we say h[0].push(99)
, it pushes 99
into that array but does not assign h[0]
anything. So if you output h
you will still see an empty hash {}
, while the default object will be [99]
.
Whereas, when a block is provided i.e. Hash.new{|h,k| h[k] = [] }
a new object is created and is assigned to h[k]
every time a default value is required.
h[0].push(99)
will assign h[0] = []
and push value into this new array.