配列応用レベル
次のプログラムを実行すると何が表示されますか?
charges = [{ name: "basic", amount: 1000 }] backup = charges + [] charges[0][:amount] = 2000 p backup
- 1[{:name=>"basic", :amount=>1000}]
- 2[{:name=>"basic", :amount=>2000}]
- 3[]
- 4NoMethodError が発生する
解説
charges + [] によって配列オブジェクト自体は新しく作られます。しかし、配列の中に入っているハッシュまでは深くコピーされません。charges[0] と backup[0] は同じハッシュを参照しているため、charges[0][:amount] = 2000 の変更は backup から見ても反映されます。バックアップのつもりで浅いコピーを使うと、元の値を保持できないことがあります。