代入と破壊
破壊しない代入と破壊する代入
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 |
結論
破壊的メソッドを用いるときは、十分に注意しましょう。