今回はRubyでの配列のインスタンス共有とコピーについて、実際の問題とその解決方法を紹介します。この記事では、特にdup
メソッドを使って元の配列が変更されるのを防ぐ方法に焦点を当てます。
問題の背景
Rubyでは、変数にはオブジェクトの実体ではなく、そのオブジェクトへの参照が格納されます。したがって、ある変数を別の変数に代入すると、両方の変数が同じオブジェクトを参照することになります。これにより、どちらかの変数を通じてオブジェクトが変更されると、他方の変数でもその変更が反映されることになります。
例えば、以下のコードを見てください。
original_array = ["apple", "grape"]
save_array = []
p save_array = original_array
original_array[0] = "banana"
p original_array
p save_array
このコードを実行すると、save_array
にoriginal_array
を保存したと思いましたが、実際にはoriginal_array
の変更がsave_array
にも反映されてしまいます。
これは、save_arrayがoriginal_arrayと同じインスタンスを参照しているためです。
["apple", "grape"]
["banana", "grape"]
["banana", "grape"]
解決方法:dup
メソッドを使用してコピーを作成する
この問題を解決するには、元の配列のコピーを作成してから変更を行います。Rubyのdup
メソッドを使ってこれを実現します。
修正後のコード
original_array = ["apple", "grape"]
save_array = []
p save_array = original_array.dup
original_array[0] = "banana"
p original_array
p save_array
このコードでは、dup
メソッドを使用してoriginal_array
のコピーを作成し、そのコピーに対して変更を行っています。これにより、save_array
は変更されずに済みます。
["apple", "grape"]
["apple", "grape"]
["banana", "grape"]
まとめ
Rubyでは、変数が同じオブジェクトを参照していると、意図せずオブジェクトが変更されることがあります。この問題を防ぐためには、dup
メソッドを使用してオブジェクトのコピーを作成し、元のオブジェクトが変更されないようにすることが重要です。