Forum: Ruby freeze and hash

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Schüle Daniel (Guest)
on 2006-03-13 01:51
(Received via mailing list)
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
Charles Mills (Guest)
on 2006-03-13 02:55
(Received via mailing list)
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
Timothy H. (Guest)
on 2006-03-13 03:04
(Received via mailing list)
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.
This topic is locked and can not be replied to.