class Foo attr_accessor :ary def initialize self.ary = [] end end before = Foo.new before.ary = [1, 2, 3] dup = before.dup dup_ary_copy = dup.ary dup_ary_copy.reverse! p before.ary #=> [3, 2, 1]
dup したところで、複製されたオブジェクトのインスタンス変数の object_id まで変わるわけじゃないですよね。
リファレンスをよく読むと書いてあります。
複製されたオブジェクトの object_id が変わるのは、複製されたオブジェクトに新しいオブジェクトがセットされたときであって、たとえば上のコードで dup = before.dup の後に dup.ary = [4, 5, 6] みたいな行を入れてあげれば、最終行の結果は [1, 2, 3] になる。
Ruby の変数代入は名札付けに過ぎないんですよね。
理解してるつもりで全然理解してなくて、本当にだめだめです。
入れ物ではない、入れ物ではない、入れ物ではない。