2
0

Rubyで配列の変更を防ぐ:インスタンスの共有とコピーについて

Last updated at Posted at 2024-07-23

今回はRubyでの配列のインスタンス共有とコピーについて、実際の問題とその解決方法を紹介します。この記事では、特にdupメソッドを使って元の配列が変更されるのを防ぐ方法に焦点を当てます。

問題の背景

Rubyでは、変数にはオブジェクトの実体ではなく、そのオブジェクトへの参照が格納されます。したがって、ある変数を別の変数に代入すると、両方の変数が同じオブジェクトを参照することになります。これにより、どちらかの変数を通じてオブジェクトが変更されると、他方の変数でもその変更が反映されることになります。

例えば、以下のコードを見てください。

example.rb
original_array = ["apple", "grape"]
save_array = []
p save_array = original_array
original_array[0] = "banana"
p original_array
p save_array

このコードを実行すると、save_arrayoriginal_arrayを保存したと思いましたが、実際にはoriginal_arrayの変更がsave_arrayにも反映されてしまいます。
これは、save_arrayがoriginal_arrayと同じインスタンスを参照しているためです。

terminal
["apple", "grape"]
["banana", "grape"]
["banana", "grape"]

解決方法:dupメソッドを使用してコピーを作成する

この問題を解決するには、元の配列のコピーを作成してから変更を行います。Rubyのdupメソッドを使ってこれを実現します。

修正後のコード

example.rb
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は変更されずに済みます。

terminal
["apple", "grape"]
["apple", "grape"]
["banana", "grape"]

まとめ

Rubyでは、変数が同じオブジェクトを参照していると、意図せずオブジェクトが変更されることがあります。この問題を防ぐためには、dupメソッドを使用してオブジェクトのコピーを作成し、元のオブジェクトが変更されないようにすることが重要です。

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0