概要
固定長の配列を初期化する
方法
Array.new
を使う
sample
Array.new(5)
=> [nil, nil, nil, nil, nil]
初期値の設定
# 第二引数に設定
Array.new(5, 0)
=> [0, 0, 0, 0, 0]
# block でも可
Array.new(3){ "foo" }
=> ["foo", "foo", "foo"]
2重配列
# blockを応用して2重配列
Array.new(3){ Array.new(2) }
=> [[nil, nil], [nil, nil], [nil, nil]]
最後に
rubyだとあまり使わないだろうけれど、、、
new
での初期化を覚えておくといざというときに便利かもしれない
追記
初期化した際のオブジェクト周りについて興味深いコメント頂いたので追加で調べて追記
引数で初期化する場合、オブジェクトが共通になっている
arr = Array.new(5, [])
=> [[], [], [], [], []]
# オブジェクトに破壊的な変更を加えてみる
arr[0].push 1
arr
=> [[1], [1], [1], [1], [1]] # オブジェクトを共有しているのですべて変わる
# 一応は、破壊的な変更ではなく別のオブジェクトに差し替えれば変更の範囲を制限できる
arr[0] = [2]
arr
=> [[2], [1], [1], [1], [1]]
ブロックで初期化する場合は、別のオブジェクトになる
arr = Array.new(5){ [] }
=> [[], [], [], [], []]
arr[0].push 1
arr
=> [[1], [], [], [], []] # 変更したものだけ
配列を与えて初期化した場合は、オブジェクトが共通
a = [[], [], []]
b = Array.new(a)
=> [[], [], []]
a[0].push 1 # aを変更すると
a
=> [[1], [], []]
b
=> [[1], [], []] # bも変わる
こういった挙動の差異はしっかり拾っていきたいところ