rubyo (るびお) の日記を見て、 << *1 しちゃうと dog.name も変わるのでは? と思って、dup したり clone したりしたけど、それでも変わっちゃう。
>> class Dog >> attr_reader :name >> def initialize(name) >> @name = name >> end >> end => nil >> name = "name" => "name" >> dog1 = Dog.new(name) => #<Dog:0xb7c1fbf0 @name="name"> >> dog2 = dog1.dup => #<Dog:0xb7c1d7d8 @name="name"> >> dog3 = dog1.clone => #<Dog:0xb7c18828 @name="name"> >> dog4 = Marshal.load(Marshal.dump(dog1)) => #<Dog:0xb7c0190c @name="name"> >> name << "+1" => "name+1" >> dog1 => #<Dog:0xb7c1fbf0 @name="name+1"> >> dog2 => #<Dog:0xb7c1d7d8 @name="name+1"> >> dog3 => #<Dog:0xb7c18828 @name="name+1"> >> dog4 => #<Dog:0xb7c0190c @name="name">
あんまり気にしたことなかったけど、dup/clone ではインスタンス変数はそのままなんですね。
*1 某所では「くっく」と呼ぶらしい