MST
星途 面试题库

面试题:Ruby中对象克隆与浅拷贝的区别及实现方式

在Ruby中,简述对象克隆(clone)和浅拷贝(dup)的区别,并分别给出实现对象克隆和浅拷贝的代码示例。同时说明在一般情况下,什么场景会选择使用克隆,什么场景会选择使用浅拷贝。
49.3万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 对象ID
    • clone方法会复制对象及其所有实例变量,新对象的object_id与原对象不同。同时,clone会复制对象的taintfrozenuntrust状态。
    • dup方法同样会复制对象及其所有实例变量,新对象的object_id也与原对象不同,但dup不会复制对象的taintfrozenuntrust状态。
  2. 继承相关
    • clone会继承原对象的单例方法。
    • dup不会继承原对象的单例方法。

代码示例

class MyClass
  def initialize(value)
    @value = value
  end

  def value
    @value
  end

  def set_value(new_value)
    @value = new_value
  end
end

# 克隆示例
obj1 = MyClass.new(10)
obj1_clone = obj1.clone
puts "obj1 object_id: #{obj1.object_id}"
puts "obj1_clone object_id: #{obj1_clone.object_id}"
puts "obj1 value: #{obj1.value}"
puts "obj1_clone value: #{obj1_clone.value}"
obj1.set_value(20)
puts "obj1 new value: #{obj1.value}"
puts "obj1_clone value after obj1 change: #{obj1_clone.value}"

# 浅拷贝示例
obj2 = MyClass.new(30)
obj2_dup = obj2.dup
puts "obj2 object_id: #{obj2.object_id}"
puts "obj2_dup object_id: #{obj2_dup.object_id}"
puts "obj2 value: #{obj2.value}"
puts "obj2_dup value: #{obj2_dup.value}"
obj2.set_value(40)
puts "obj2 new value: #{obj2.value}"
puts "obj2_dup value after obj2 change: #{obj2_dup.value}"

使用场景

  1. 克隆(clone)
    • 当你需要一个与原对象完全一样,包括对象的状态(taintfrozen等)以及单例方法的副本时,使用clone。例如,在某些安全相关的场景中,对象的taint状态很重要,需要精确复制时。
  2. 浅拷贝(dup)
    • 当你只关心对象的实例变量的复制,而不关心对象的taintfrozen状态以及单例方法时,使用dup。例如,在一些简单的数据处理场景中,只需要快速复制对象的实例变量进行独立操作。