多次元配列

Rubyでは基本的に配列は一次元。多次元配列を定義する方法はいつくかあるようだが、その中の一つ。

da=Array.new(3).map!{Array.new}

配列の初期化ついては注意が必要。

da=Array.new(3,Array.new(4,0))

のようにnewの引数に初期値を与えると、3個の配列がすべて同じオブジェクトになってしまう。

da[0][1]=7
p da #=> [[0,7,0,0],[0,7,0,0],[0,7,0,0]]
da=Array.new(3).map!{Array.new(4){0}}

のようにブロックを使用すれば大丈夫。

*確認したところ、

da=Array.new(3).map!{Array.new(4,0)}

でも問題なかったが、ブロック文の方が安全か。
一次元配列でさらに確認してみると、

ary=Array.new(3,"foo")
ary[0].capitalize! 
p ary #=>gt;["Foo", "Foo", "Foo"]

とすべての要素が化けてしまうが、最後が破壊的メソッドでなく

ary[0]=ary[0].capitalize

のように代入してしえば一つの要素だけを変更できる。
とりあえず、配列の取扱いは代入を基本としている限りは大丈夫そうだが
念のためブロックを使って初期化するに越したことはない。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です