2006-04-06 [長年日記]

_ [ruby] dup/clone とインスタンス変数

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 某所では「くっく」と呼ぶらしい

[]