Method: Configatron::Store#deep_clone
- Defined in:
- lib/gems/configatron-2.2.2/lib/configatron/store.rb
#deep_clone(obj = self, cloned = {}) ⇒ Object
DeepClone
Version
1.2006.05.23 (change of the first number means Big Change)
Description
Adds deep_clone method to an object which produces deep copy of it. It means
if you clone a Hash, every nested items and their nested items will be cloned.
Moreover deep_clone checks if the object is already cloned to prevent endless recursion.
Usage
(see examples directory under the ruby gems root directory)
require 'rubygems'
require 'deep_clone'
include DeepClone
obj = []
a = [ true, false, obj ]
b = a.deep_clone
obj.push( 'foo' )
p obj # >> [ 'foo' ]
p b[2] # >> []
Source
simplypowerful.1984.cz/goodlibs/1.2006.05.23
Author
jan molic (/mig/at_sign/1984/dot/cz/)
Licence
You can redistribute it and/or modify it under the same terms of Ruby's license;
either the dual license version in 2003, or any later version.
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 |
# File 'lib/gems/configatron-2.2.2/lib/configatron/store.rb', line 192 def deep_clone( obj=self, cloned={} ) if cloned.has_key?( obj.object_id ) return cloned[obj.object_id] else begin cl = obj.clone rescue Exception # unclonnable (TrueClass, Fixnum, ...) cloned[obj.object_id] = obj return obj else cloned[obj.object_id] = cl cloned[cl.object_id] = cl if cl.is_a?( Hash ) cl.clone.each { |k,v| cl[k] = deep_clone( v, cloned ) } elsif cl.is_a?( Array ) cl.collect! { |v| deep_clone( v, cloned ) } end cl.instance_variables.each do |var| v = cl.instance_eval( var.to_s ) v_cl = deep_clone( v, cloned ) cl.instance_eval( "#{var} = v_cl" ) end return cl end end end |