Ruby

2016-01-12, ruby

多次元配列の初期化

Rubyでは乗算の演算子(*)を使って配列の宣言が可能ですが、多次元配列にするときには気をつけるポイントがあります。下記のコード例を見ていただくと分かる通り、外側の配列に包含される配列の実体が一つなんですね。これに気付かないと、思わぬ不具合につながることがありそうです。

irb(main):001:0> arr = [[0] * 2] * 3
=> [[0, 0], [0, 0], [0, 0]]
irb(main):002:0> arr[1][1] = 1
=> 1
irb(main):003:0> arr
=> [[0, 1], [0, 1], [0, 1]]

それぞれの要素を別個に扱いたい場合は、ブロックを受け取るArray.newを使って初期化するとよいでしょう。

irb(main):004:0> arr = Array.new(3) { Array.new(2,0) }
=> [[0, 0], [0, 0], [0, 0]]
irb(main):005:0> arr[1][1] = 1
=> 1
irb(main):006:0> arr
=> [[0, 0], [0, 1], [0, 0]]

参考URL

この記事は役に立ちましたか?