【ruby on rails】dup、deep_dup、clone的区别

[复制链接]
发表于 2025-12-19 04:52:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、区别


  • dup
浅复制:dup 方法创建对象的浅复制。
不复制冻结状态:dup 不会复制对象的冻结状态。
不复制单例方法:dup 不会复制对象的单例方法。

  • deep_dup
深复制:deep_dup 方法创建对象的深复制,递归复制嵌套的对象。
必要手动实现:deep_dup 不是 Ruby 内置的方法,通常必要手动实现或使用 ActiveSupport 提供的实现。

  • clone
浅复制:clone 方法创建对象的浅复制。
复制冻结状态:clone 会复制对象的冻结状态。
复制单例方法:clone 会复制对象的单例方法。
二、示例


  • 浅复制的意思是只复制对象的第一层属性,不会递归复制嵌套的对象。
  • 深复制的意思是递归复制嵌套对象
  1. require 'active_support/core_ext/object/deep_dup'
  2. # 使用 dup
  3. # 这里 original 是一个包含嵌套哈希的哈希。dup 方法只复制了 original 的第一层属性,因此 dup_copy[:b] 和 original[:b] 仍然引用同一个嵌套哈希 { c: 4 }。所以修改 dup_copy[:b][:c] 也会影响 original[:b][:c]
  4. original = { a: [1, 2, 3], b: { c: 4 } }
  5. dup_copy = original.dup
  6. dup_copy[:b][:c] = 5
  7. puts original[:b][:c] # => 5 (浅复制)
  8. original = "hello".freeze
  9. copy = original.dup
  10. copy.frozen? # => false (不复制冻结状态)
  11. # 使用 deep_dup
  12. original = { a: [1, 2, 3], b: { c: 4 } }
  13. deep_dup_copy = original.deep_dup
  14. deep_dup_copy[:b][:c] = 6
  15. puts original[:b][:c] # => 4 (深复制)
  16. # 使用 clone
  17. original = { a: [1, 2, 3], b: { c: 4 } }
  18. clone_copy = original.clone
  19. clone_copy[:b][:c] = 7
  20. puts original[:b][:c] # => 7 (浅复制)
  21. original_str = "hello".freeze
  22. clone_copy = original_str.clone
  23. puts clone_copy.frozen? # => true (复制冻结状态)
复制代码
三、dup 方法常用场景:通常用于创建对象的浅复制
  1. # 避免修改原始对象
  2. original_array = [1, 2, 3]
  3. copy_array = original_array.dup
  4. copy_array << 4
  5. puts original_array.inspect # => [1, 2, 3]
  6. puts copy_array.inspect     # => [1, 2, 3, 4]
  7. # 复制可变对象
  8. original_hash = { a: 1, b: 2 }
  9. copy_hash = original_hash.dup
  10. copy_hash[:c] = 3
  11. puts original_hash.inspect # => {:a=>1, :b=>2}
  12. puts copy_hash.inspect     # => {:a=>1, :b=>2, :c=>3}
  13. # 复制对象的状态
  14. class MyClass
  15.   attr_accessor :value
  16. end
  17. original = MyClass.new
  18. original.value = 10
  19. copy = original.dup
  20. copy.value = 20
  21. puts original.value # => 10
  22. puts copy.value     # => 20
  23. # 复制 ActiveRecord 对象
  24. original_user = User.find(1)
  25. copy_user = original_user.dup
  26. copy_user.email = "[email protected]"
  27. copy_user.save
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表