Hash.new([])は同じ[]を参照するので…。
Hash.new(val) は、ハッシュの default 属性に val を設定します。値が設 定されていないハッシュの参照はこの default 属性を返しているだけです。
h = Hash.new([]) h[0] << 0 h[1] << 1 p h #=> {} p h.default #=> [0, 1]
上記で、<< は default を破壊的に変更するだけで、h[0] などに影響を与 えません。+= などの破壊的でないメソッドで再代入する必要が有ります。
h = Hash.new([]) h[0] += [0] h[1] += [1] p h #=> {0=>[0], 1=>[1]} p h.default #=> []
また、このようなミスを防ぐためにも初期値は freeze しておくのが無難です。
h = Hash.new([].freeze) h[0] += [0] h[1] << 1 => -:3:in `<<': can't modify frozen array (TypeError)