質問: ruby2.1.1の環境において、以下のようなコードを実行します。 ``` hashA={"test"=>"aaaa"} arrayA=Array.new #ハッシュを配列に格納 arrayA.push(hashA) p hashA #配列に投入したハッシュの値を変更 arrayA[0]["test"]="bbbb" p hashA ``` 実行結果 ``` {"test"=>"aaaa"} {"test"=>"bbbb"} ``` arrayA.push(hashA) を実行したときにhashAそのものが配列に渡されているようで、 配列の中の値を変更したときにhashAそのものの値も変更されてしまっています。 配列の中にはhashAのコピーを渡して、 配列の中を更新しても、hashAそのものは更新させたくないのですが、どのように記述すればよいでしょうか? また、rubyは基本値渡しであると理解しているのですが、なぜこのような参照渡しのような動作をするのでしょうか? どうぞよろしくお願いします!!
回答: > > また、rubyは基本値渡しであると理解しているのですが、なぜこのような参照渡しのような動作をするのでしょうか? > > > オブジェクトへのポインタの値渡しです。なので、値渡しか参照渡しか二者択一と言われると、参照渡しですね。 なぜ値渡しと思ったのでしょうか? > > どのように記述すればよいでしょうか? > > > この場合だと、`hashA.dup`をpushすればいいですが、一般にはコピーを作るのは簡単ではないです。 どう難しいかは、「ディープコピー」「シャロウコピー」について調べてみて下さい。