配列応用レベル

次のプログラムを実行すると何が表示されますか?

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 から見ても反映されます。バックアップのつもりで浅いコピーを使うと、元の値を保持できないことがあります。

問題一覧へ戻る