Ruby中数组的深拷贝

Posted

技术标签:

【中文标题】Ruby中数组的深拷贝【英文标题】:Deep copy of arrays in Ruby 【发布时间】:2012-01-26 07:54:13 【问题描述】:

我想在生产中获取一个对象,并对另一个相同类型的对象进行精确的复制(复制其内容)。我尝试从 ruby​​ 控制台以 3 种方式执行此操作,但均无效:

    假设您将tt 作为要复制的第一个对象,将tt2 作为副本对象。我尝试的第一种方法是克隆数组

    tt2.patients  = tt.urls.patients
    tt2.doctors   = tt.segments.doctors
    tt2.hospitals = tt.pixels.hospitals
    

    我尝试的第二种方法是复制数组,实际上与克隆数组相同:

    tt2.patients  = tt.patients.dup
    tt2.doctors   = tt.doctors.dup
    tt2.hospitals = tt.hospitals.dup
    

    我尝试的第三种方法是编组。

    tt2.patients  = Marshal.load(Marshal.dump(tt.patients)) 
    tt2.doctors   = Marshal.load(Marshal.dump(tt.doctors)) 
    tt2.hospitals = Marshal.load(Marshal.dump(tt.hospitals)) 
    

以上都不适用于从一个数组到另一个数组的深度复制。在分别尝试了上述每种方法后,第一个对象 (tt) 的所有内容都无效(患者、医生和医院都消失了)。您对将一个对象的内容复制到另一个对象有任何其他想法吗?谢谢。

【问题讨论】:

您只是在第一个示例中设置变量。试试 tt2.patients = tt.patiens.clone。 【参考方案1】:

Ruby Facets 是一组有用的 Ruby 扩展,并且有一个可能适合您的 deep_clone 方法。

【讨论】:

链接失效了。指向deep_clone is here的新链接。【参考方案2】:

简单!

@new_tt            = tt2.clone
@new_tt.patients   = tt2.patients.dup
@new_tt.doctors    = tt2.doctors.dup
@new_tt.hospitals  = tt2.hospitals.dup
@new_tt.save

【讨论】:

这很好用。 new_tt 拥有我现在需要的所有信息。但是,在执行您上面告诉我的操作后,tt2(患者,医生,医院)的所有内容都消失了。 tt2的内容怎么保存? 糟糕!我在那里有一个语法错误。我更新了上面的代码。试试看。 这和他的第二种方法有什么不同?【参考方案3】:

这就是ActiveRecord::Base#clone 方法的用途:

@bar = @foo.clone

@bar.save

【讨论】:

以上是关于Ruby中数组的深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

拷贝数组和对象,深拷贝,浅拷贝

6javascript中对象和数组的深拷贝

javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

jquery怎样深拷贝一个数组

数组的深拷贝与浅拷贝

数组的深拷贝与浅拷贝