From: David Maciejak Date: 2009-06-09T19:29:01+09:00 Subject: Re: ruby dup unexpected behaviour Thanks for the details, in the end as you said I did the deep copy myself. I will close the ubuntu entry. david On Tue, Jun 9, 2009 at 12:20 PM, Brian Candler wrote: > 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/. > >