# Ruby dup unexpected behaviour

**URL:** <https://www.ruby-forum.com/t/ruby-dup-unexpected-behaviour/169830>\
**Category:** Ruby\
**Created:** [June 9, 2009, 11:52am UTC](https://www.ruby-forum.com/t/ruby-dup-unexpected-behaviour/169830 "2009-06-09T11:52:41Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![dgm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df788c/32.png) [@dgm](https://www.ruby-forum.com/u/dgm)\
**Post date:** [June 9, 2009, 11:52am UTC](https://www.ruby-forum.com/t/ruby-dup-unexpected-behaviour/169830/1 "2009-06-09T11:52:41Z")

</div>

Hi,

I got no answer on ubuntu entry at

> **[Bug #384265 “ruby dup unexpected behaviour” : Bugs : ruby1.8 package : Ubuntu](https://bugs.launchpad.net/ubuntu/+source/ruby1.8/+bug/384265)**
>
> Binary package hint: ruby1.8
> 
> Hi,
> 
> got some strange result in ruby1.8 (1.8.7.72-3) on jaunty (up to date).
> Don't know if I use correctly dup function but my duped hash is modified even if i call the freeze method. Below the quick and dirty test case...

so I resend it here. Does someone have any clues on this ?

Thanks,  
david

* * *

Hi,

got some strange result in ruby1.8 (1.8.7.72-3) on jaunty (up to date).  
Don’t know if I use correctly dup function but my duped hash is  
modified even if i call the freeze method. Below the quick and dirty  
test case showing that @c member of the class Global is modified

#!/usr/bin/ruby

class Testme  
attr\_accessor :value  
def initialize(val)  
@value=val  
end  
def Testme::bou(val)  
$a[“b”].value=val  
end  
def to\_str()  
print @value,“\n”  
end  
end

class Global

def initialize  
@c=nil  
end

def go()  
@c=$a.dup  
@c.freeze  
#print value before the changes  
to\_str()  
end  
def to\_str()  
print @c,“\n”  
end

end

$a=Hash.new  
$a[“a”]=Testme.new(1)  
$a[“b”]=Testme.new(2)

main=Global.new  
main.go()  
Testme::bou(3)  
#print value after the changes  
main.to\_str()

---

<div class="post-metadata">

**Author:** ![dgm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df788c/32.png) [@dgm](https://www.ruby-forum.com/u/dgm)\
**Post date:** [June 9, 2009, 12:19pm UTC](https://www.ruby-forum.com/t/ruby-dup-unexpected-behaviour/169830/2 "2009-06-09T12:19:58Z")

</div>

David M. wrote:

> I got no answer on ubuntu entry at  
> [Bug #384265 “ruby dup unexpected behaviour” : Bugs : ruby1.8 package : Ubuntu](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.

---

<div class="post-metadata">

**Author:** ![dgm](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df788c/32.png) [@dgm](https://www.ruby-forum.com/u/dgm)\
**Post date:** [June 9, 2009, 12:30pm UTC](https://www.ruby-forum.com/t/ruby-dup-unexpected-behaviour/169830/3 "2009-06-09T12:30:11Z")

</div>

Thanks for the details, in the end as you said I did the deep copy  
myself. I will close the ubuntu entry.

david
