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

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

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

    tt2.patients  = tt.urls.patients
    tt2.doctors   = tt.segments.doctors
    tt2.hospitals = tt.pixels.hospitals
    
  2. 我尝试的第二种方法是复制数组,实际上与克隆数组相同:

    tt2.patients  = tt.patients.dup
    tt2.doctors   = tt.doctors.dup
    tt2.hospitals = tt.hospitals.dup
    
  3. 我尝试的第三种方法是编组。

    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。

标签: ruby-on-rails ruby arrays copy clone


【解决方案1】:

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

【讨论】:

【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2013-09-09
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多