Hashについてなるほど、とおもったのでメモ。
初歩的すぎることっぽいけど自分がいままで知らなかったので書く。
というかほとんどリファレンスマニュアルの引用。

ハッシュの初期値に配列を使いたいときに、今までは

Hash.new([])

ってやってたんだけど、これだと

irb(main):001:0> h = Hash.new([])
=> {}
irb(main):002:0> h[0] << "a"
=> ["a"]
irb(main):003:0> p h
{}
=> nil

とかなっちゃっててハッシュとしてうまく使えてなかった。
なんでだろー、とか思いつつ、どうにか別な方法をつかうことでしのいできたんだけれども、ふとしたことからリファレンスマニュアルをみるとこんな記述が。以下プログラミング言語 Ruby リファレンスマニュアルより引用。

Hash.new()は同じを参照するので…。

Hash.new(val) は、ハッシュのデフォルトオブジェクトに val を設定します。値が設定されていないハッシュの参照はこのデフォルトオブジェクトを返しているだけです。

h = Hash.new()
h[0] << 0
h[1] << 1
p h #=> {}
p h.default #=> [0, 1]

上記で、<< はデフォルトオブジェクトを破壊的に変更するだけで、h[0] などに影響を与えません。+= などの破壊的でないメソッドで再代入する必要が有ります。

h = Hash.new()
h[0] += [0]
h[1] += [1]
p h #=> {0=>[0], 1=>[1]}
p h.default #=> []

なるほどー。超納得。
ということでどうすりゃいいんだろう、と思ってさらにちゃんとみてみると、プログラミング言語 Ruby リファレンスマニュアル

Hash.new {|hash, key| ...} (ruby 1.7 feature)

空の新しいハッシュを生成します。ifnone はキーに対応する値が存在しない時のデフォルト値です。デフォルト値の扱いには注意が必要です( trap::Hash )。

ruby 1.7 feature: ブロックを指定した場合は、ブロックの評価結果がデフォルト値になります。値が設定されていないハッシュ要素を参照するとその都度ブロックを実行し、その結果を返します。ブロックにはそのハッシュとハッシュを参照したときのキーが渡されます。

って書いてあったから、

Hash.new {|h,k| h[k] = []}

ってしてあげると解決。多分。
irbでも

irb(main):001:0> h = Hash.new{|h,k|h[k]=[]}
=> {}
irb(main):002:0> h[0] = "a"
=> "a"
irb(main):003:0> p h
{0=>"a"}
=> nil

ってな感じで期待通り。
マニュアルはちゃんと読もうと思った。