代入と破壊
破壊しない代入と破壊する代入
a = [1, 2]
は配列[1, 2]
に変数a
を割り当てるだけなので普通の代入です。
a[0] = 0
は配列を破壊する代入です。
例えば、
a = [1, 2]
b = a
a[0] = 0
p a # [0, 2]
p b # [0, 2]
となり、b
まで影響を及ぼしてしまします。
文 | 配列 | 変数 |
---|---|---|
a = [1, 2] |
[1, 2] |
a |
b = a |
[1, 2] |
a , b |
a[0] = 0 |
[0, 2] |
a , b |
破壊する理由
[]=
は破壊的メソッドなのでインスタンスが破壊されます。
対策
上の例でb
まで影響を及ぼしたくない場合は、インスタンスを複製します。
a = [1, 2]
b = a.clone
a[0] = 0
p a # [0, 2]
p b # [1, 2]
文 | 配列 | 変数 |
---|---|---|
a = [1, 2] |
[1, 2] |
a |
b = a.clone |
[1, 2] |
a |
[1, 2] |
b |
|
a[0] = 0 |
[0, 2] |
a |
[1, 2] |
b |
結論
破壊的メソッドを用いるときは、十分に注意しましょう。