常见陷阱
- 循环引用:如果对象之间存在循环引用,简单的递归拷贝会导致无限循环,最终耗尽内存。例如,A对象引用B对象,B对象又引用A对象。
- 对象类型差异:不同类型的对象(数组、哈希、自定义类等)需要不同的拷贝方式。例如,数组需要遍历每个元素进行拷贝,哈希需要拷贝键值对,自定义类可能需要特殊处理其属性。
- 单例对象:单例对象在拷贝时需要特殊考虑,确保拷贝后仍然是单例。
健壮的深拷贝方法代码
require 'set'
def deep_clone(obj, memo = Set.new)
case obj
when Array
obj.map { |element| deep_clone(element, memo) }
when Hash
obj.each_with_object({}) do |(key, value), result|
result[deep_clone(key, memo)] = deep_clone(value, memo)
end
when Class
# 处理类对象,这里简单返回原类
obj
when Module
# 处理模块对象,这里简单返回原模块
obj
when BasicObject
new_obj = obj.clone
memo << obj
obj.instance_variables.each do |ivar|
value = obj.instance_variable_get(ivar)
unless memo.include?(value)
new_obj.instance_variable_set(ivar, deep_clone(value, memo))
end
end
new_obj
else
obj.clone
end
end