ruby on rails - 如何在Ruby中創建對象的深層副本?




ruby-on-rails object (6)

我做了一些搜索,發現了一些關於創建深度複製操作符的不同方法和帖子。

是否有一種快速簡便的(內置)方式在Ruby中深度複製對象? 字段不是數組或散列。

在Ruby 1.9.2中工作。


Rails有一個名為deep_dup的遞歸方法,它將返回一個對象的深層副本,而與dupclone相反,它甚至可以在復合對象(數組/哈希的數組/哈希)上工作。 它很簡單:

def deep_dup
  map { |it| it.deep_dup }
end


我建議您使用ActiveSupport gem,它會為您的原生Ruby核心添加大量的糖,而不僅僅是深度克隆方法。

您可以查看documentation以獲取有關已添加方法的更多信息。


有一個本機實現來執行ruby對象的深度克隆: ruby_deep_clone

用gem安裝它:

gem install ruby_deep_clone

用法示例:

require "deep_clone"
object = SomeComplexClass.new()
cloned_object = DeepClone.clone(object)

它比Marshal方法快6到7倍,並且事件適用於凍結物體。


自動深度克隆並不總是你想要的。 通常,您需要定義選定的幾個屬性以進行深度克隆。 一種靈活的方法是實現initialize_copyinitialize_dupinitialize_clone方法。

如果你有一個班級:

class Foo
  attr_accessor :a, :b
end

並且你只想要深度克隆:b ,你覆蓋initialize_*方法:

class Foo
  attr_accessor :a, :b

  def initialize_dup(source)
    @b = @b.dup
    super
  end
end

當然如果你想讓@b深度克隆它自己的一些屬性,你也可以在b的類中做同樣的事情。

Rails這樣做(參見https://github.com/rails/rails/blob/0951306ca5edbaec10edf3440d5ba11062a4f2e5/activemodel/lib/active_model/errors.rb#L78

有關更完整的解釋,我從這篇文章中了解到這一點https://aaronlasseigne.com/2014/07/20/know-ruby-clone-and-dup/






deep-copy