LoginSignup
0
0

固定長の配列を初期化する

Last updated at Posted at 2023-07-11

概要

固定長の配列を初期化する

方法

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も変わる

こういった挙動の差異はしっかり拾っていきたいところ

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0