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中数组的深拷贝的主要内容,如果未能解决你的问题,请参考以下文章