马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、区别
浅复制:dup 方法创建对象的浅复制。
不复制冻结状态:dup 不会复制对象的冻结状态。
不复制单例方法:dup 不会复制对象的单例方法。
深复制:deep_dup 方法创建对象的深复制,递归复制嵌套的对象。
必要手动实现:deep_dup 不是 Ruby 内置的方法,通常必要手动实现或使用 ActiveSupport 提供的实现。
浅复制:clone 方法创建对象的浅复制。
复制冻结状态:clone 会复制对象的冻结状态。
复制单例方法:clone 会复制对象的单例方法。
二、示例
- 浅复制的意思是只复制对象的第一层属性,不会递归复制嵌套的对象。
- 深复制的意思是递归复制嵌套对象
- require 'active_support/core_ext/object/deep_dup'
- # 使用 dup
- # 这里 original 是一个包含嵌套哈希的哈希。dup 方法只复制了 original 的第一层属性,因此 dup_copy[:b] 和 original[:b] 仍然引用同一个嵌套哈希 { c: 4 }。所以修改 dup_copy[:b][:c] 也会影响 original[:b][:c]
- original = { a: [1, 2, 3], b: { c: 4 } }
- dup_copy = original.dup
- dup_copy[:b][:c] = 5
- puts original[:b][:c] # => 5 (浅复制)
- original = "hello".freeze
- copy = original.dup
- copy.frozen? # => false (不复制冻结状态)
- # 使用 deep_dup
- original = { a: [1, 2, 3], b: { c: 4 } }
- deep_dup_copy = original.deep_dup
- deep_dup_copy[:b][:c] = 6
- puts original[:b][:c] # => 4 (深复制)
- # 使用 clone
- original = { a: [1, 2, 3], b: { c: 4 } }
- clone_copy = original.clone
- clone_copy[:b][:c] = 7
- puts original[:b][:c] # => 7 (浅复制)
- original_str = "hello".freeze
- clone_copy = original_str.clone
- puts clone_copy.frozen? # => true (复制冻结状态)
复制代码 三、dup 方法常用场景:通常用于创建对象的浅复制
- # 避免修改原始对象
- original_array = [1, 2, 3]
- copy_array = original_array.dup
- copy_array << 4
- puts original_array.inspect # => [1, 2, 3]
- puts copy_array.inspect # => [1, 2, 3, 4]
- # 复制可变对象
- original_hash = { a: 1, b: 2 }
- copy_hash = original_hash.dup
- copy_hash[:c] = 3
- puts original_hash.inspect # => {:a=>1, :b=>2}
- puts copy_hash.inspect # => {:a=>1, :b=>2, :c=>3}
- # 复制对象的状态
- class MyClass
- attr_accessor :value
- end
- original = MyClass.new
- original.value = 10
- copy = original.dup
- copy.value = 20
- puts original.value # => 10
- puts copy.value # => 20
- # 复制 ActiveRecord 对象
- original_user = User.find(1)
- copy_user = original_user.dup
- copy_user.email = "[email protected]"
- copy_user.save
复制代码 |