配列の配列

配列の配列を作り方を聞かれて、なぜ下の例はダメなのかわからなかったのでメモ。(今まで動的に追加する配列しか作ったことなかった!)

$ ruby -e '
ary = Array.new(3, Array.new(2))
p ary
ary[1][1] = "1-1"
p ary
'
[[nil, nil], [nil, nil], [nil, nil]]
[[nil, "1-1"], [nil, "1-1"], [nil, "1-1"]]

ary[0] も ary[1] も ary[2] も同じオブジェクトを指しているから。


正しくはこうか:

ary = Array.new(3) { Array.new(2) }

(最初 map を使ってた。1.8 で追加されたのね。)


逆引きRuby」ならぬ「ありがちRuby」「Rubyの罠」みたいなサイトってあったっけ?