# Freeze and hash

**URL:** <https://www.ruby-forum.com/t/freeze-and-hash/54684>\
**Category:** Ruby\
**Created:** [March 13, 2006, 12:51am UTC](https://www.ruby-forum.com/t/freeze-and-hash/54684 "2006-03-13T00:51:40Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [March 13, 2006, 12:51am UTC](https://www.ruby-forum.com/t/freeze-and-hash/54684/1 "2006-03-13T00:51:40Z")

</div>

Hello

irb(main):069:0\* a = Hash.new([])  
=\> {}  
irb(main):070:0\> a[1] \<\< “X”  
=\> [“X”]  
irb(main):071:0\> a.freeze  
=\> {}  
irb(main):072:0\> a.frozen?  
=\> true  
irb(main):073:0\> b = a.dup  
=\> {}  
irb(main):074:0\> b.frozen?  
=\> false  
irb(main):075:0\> b.default  
=\> [“X”]  
irb(main):076:0\> b[11] \<\< “Y”  
=\> [“X”, “Y”]  
irb(main):077:0\> b.default  
=\> [“X”, “Y”]  
irb(main):078:0\> a.default  
=\> [“X”, “Y”]  
irb(main):079:0\> a.frozen?  
=\> true  
irb(main):080:0\> b.frozen?

as one can see a.default is a flat copy  
so a is modified though it’s frozen

what is the usual idom to get deep copy?

Regards, Daniel

---

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [March 13, 2006, 1:55am UTC](https://www.ruby-forum.com/t/freeze-and-hash/54684/2 "2006-03-13T01:55:01Z")

</div>

Schüle Daniel wrote:

> irb(main):073:0\> b = a.dup  
> =\> [“X”, “Y”]  
> irb(main):079:0\> a.frozen?  
> =\> true  
> irb(main):080:0\> b.frozen?
> 
> as one can see a.default is a flat copy  
> so a is modified though it’s frozen
> 
> what is the usual idom to get deep copy?
> 
> Regards, Daniel

Try

a = Hash.new { [] }

When a default value is needed the proc is run and its return value is  
used.  
See ri Hash.new for more info.

-Charlie

---

<div class="post-metadata">

**Author:** ![SchSSS\_le\_Daniel](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/a183cd/32.png) [@SchSSS\_le\_Daniel](https://www.ruby-forum.com/u/SchSSS_le_Daniel)\
**Post date:** [March 13, 2006, 2:04am UTC](https://www.ruby-forum.com/t/freeze-and-hash/54684/3 "2006-03-13T02:04:05Z")

</div>

Schüle Daniel wrote:

> irb(main):073:0\> b = a.dup  
> =\> [“X”, “Y”]

Freezing the hash doesn’t freeze the array that is its default value  
(shared with b). See yesterday’s thread “Strange behavior” about what’s  
going on here.

Regarding the deep copy, the usual idiom is Marshal.dump/Marshal.load.
