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.