Rubyの多次元配列の初期化について

最近やらかしたRubyでのミスについて書いてみます。

多次元配列の初期化についてなのですが、最初はこんな風に書きました。

array = Array.new(3,Array.new(3,0));

これで問題なく通りますし、良いような気がするのですが、この配列をいじってみると変なことが起こります。

例えば、

array[0][0] = 1

としたとします。このとき、配列の中身は

[[1,0,0],[0,0,0],[0,0,0]]

となっていてほしいのですが、残念ながらこうはなりません。
実際には、

[[1,0,0],[1,0,0],[1,0,0]]

となってしまいます。どうやら全部同じ配列を参照しているようです。

思った通りの働きをするには

array = Array.new(3){Array.new(3,0)}

としなければなりません。なんでこんな風になるのか、Rubyのブロックの使い方は独特ですね。ちょっとこの辺も勉強してみようと思います。