区别
- 对象ID:
clone
方法会复制对象及其所有实例变量,新对象的object_id
与原对象不同。同时,clone
会复制对象的taint
、frozen
和untrust
状态。
dup
方法同样会复制对象及其所有实例变量,新对象的object_id
也与原对象不同,但dup
不会复制对象的taint
、frozen
和untrust
状态。
- 继承相关:
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}"
使用场景
- 克隆(clone):
- 当你需要一个与原对象完全一样,包括对象的状态(
taint
、frozen
等)以及单例方法的副本时,使用clone
。例如,在某些安全相关的场景中,对象的taint
状态很重要,需要精确复制时。
- 浅拷贝(dup):
- 当你只关心对象的实例变量的复制,而不关心对象的
taint
、frozen
状态以及单例方法时,使用dup
。例如,在一些简单的数据处理场景中,只需要快速复制对象的实例变量进行独立操作。