MST
星途 面试题库

面试题:Ruby深拷贝实现的常见陷阱及解决方案

请描述在Ruby中实现对象深拷贝可能遇到的常见陷阱,例如循环引用等问题。并给出针对这些陷阱实现一个较为健壮的深拷贝方法的代码,要求考虑到对象的各种类型(如数组、哈希、自定义类等)。
36.0万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

常见陷阱

  1. 循环引用:如果对象之间存在循环引用,简单的递归拷贝会导致无限循环,最终耗尽内存。例如,A对象引用B对象,B对象又引用A对象。
  2. 对象类型差异:不同类型的对象(数组、哈希、自定义类等)需要不同的拷贝方式。例如,数组需要遍历每个元素进行拷贝,哈希需要拷贝键值对,自定义类可能需要特殊处理其属性。
  3. 单例对象:单例对象在拷贝时需要特殊考虑,确保拷贝后仍然是单例。

健壮的深拷贝方法代码

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