David Maciejak wrote:
> I got no answer on ubuntu entry at
> https://bugs.launchpad.net/ubuntu/+source/ruby1.8/+bug/384265
> so I resend it here. Does someone have any clues on this ?

dup is a "shallow" copy. For a Hash, you'll get a new Hash but with the 
keys and values pointing to the same objects.

>> h1 = {1=>"one", 2=>"two"}
=> {1=>"one", 2=>"two"}
>> h2 = h1.dup
=> {1=>"one", 2=>"two"}
>> h1.object_id
=> -605621648
>> h2.object_id
=> -605633988           #<< the hashes are different objects
>> h1[1].object_id
=> -605621708
>> h2[1].object_id
=> -605621708           #<< the values are the same object
>> 

If you want a deep copy, you have to do it yourself.

Similarly, if you freeze a Hash, you are just freezing the Hash itself, 
not all the objects it points to.

>> h1
=> {1=>"one", 2=>"two"}
>> h1.freeze
=> {1=>"one", 2=>"two"}
>> h1[2] << "xxx"
=> "twoxxx"
>> h1
=> {1=>"one", 2=>"twoxxx"}

If you want a "deep freeze" then you'll have to do it yourself.

Your test code looks rather more convoluted than it needs to be, so you 
should be able to boil it down to a two or three line case which shows 
you what's happening.

However I suggest you close the Ubuntu ticket though as 'invalid'

Regards,

Brian.
-- 
Posted via http://www.ruby-forum.com/.