Tag: 深拷贝

Ruby on Rails深度复制/深层克隆对象及其属性

我想对包括所有属性的对象进行深层复制。 experiment_old有10个试验。 我希望通过10次试验将所有内容复制到experiment_new中。 experiment_old还应保留10个试用信息。 但是,我在下面尝试过的所有情况都会很好地复制一切,但是experiment_old没有10个试验信息。 他们只是出现在experiment_new上。 对这些案例进行深层复制的最佳方法是什么。 情况1: @experiment_new = Experiment.create(@experiment_old.attributes.merge(:trials => experiment_old.trails)) 案例2: @experiment_new = Marshal.load(Marshal.dump(@experiment_old.trials)) 案例3: @experiment_new = @experiment_old.clone 这是模型: class Experiment < ActiveRecord::Base belongs_to :experimenter has_many :trials has_many :participants end class Trial < ActiveRecord::Base belongs_to :experiment belongs_to :datum belongs_to :condition has_one :result_trial end

Ruby:对象深度复制

我正在研究一些在Ruby中深度复制对象的技术(MRI 1.9.3)。 我遇到了以下示例,但我不确定#dup方法的实现。 我测试了它并且它确实有效,但是我不理解该方法的逻辑步骤,因此我在自己的代码中使用它并不舒服。 语句@name = @name.dup是指副本中的iVar吗? 怎么样? 我看不到它。 请问有人解释一下吗? 还有,有更好的方法吗? class MyClass attr_accessor :name def initialize(arg_str) # called on MyClass.new(“string”) @name = arg_str # initialize an instance variable end def dup the_copy = super # shallow copy calling Object.dup @name = @name.dup # new copy of istance variable return the_copy # return the copied […]

为什么Ruby中没有深层复制方法?

我正在研究技术图纸(svg / ruby​​)的解决方案。 我想操纵矩形,并add! 这个类中的方法: class Rect def add!(delta) @x1+=delta … # and so on self end end 我还需要一个返回Rect的add方法,但不需要操作self : def add(delta) r=self.dup/clone/”copy” # <– not realy the 3 and no quotes, just in text here r.add! delta end dup和clone不做我的事情,但是: def copy; Marshal.load(Marshal.dump(self)); end 确实。 为什么普通Ruby中不存在这样的基本function? 请不要告诉我,我可以反向add和add! ,让add完成工作,并add! 叫它。

在Ruby中深度复制对象的最有效方法是什么?

我知道序列化一个对象是(据我所知)有效深度复制一个对象的唯一方法(只要它不像IO和诸如此类的状态),但是这种方式比另一种方式更有效吗? 例如,因为我正在使用Rails,所以我总是可以使用ActiveSupport::JSON , to_xml – 从我可以告诉编组的对象是最常被接受的方法之一。 我希望编组可能是最有效的,因为它是一个Ruby内部,但我错过了什么? 编辑 :请注意,它的实现是我已经涵盖的内容 – 我不想替换现有的浅拷贝方法(如dup和clone ),所以我最终可能会添加Object::deep_copy ,其结果是无论上述哪种方法(或任何建议:)都有最少的开销。

如何在Ruby中创建用于深度复制/克隆对象的运算符?

我想通过引入一个新的运算符来实现以下目的(例如:= ) a := b = {} b[1] = 2 pa # => {} pb # => {1=>2} 据我所知,我需要修改Object类,但我不知道该怎么做才能得到我想要的东西。 require ‘superators’ class Object superator “:=” operand # update, must be: superator “:=” do |operand| # self = Marshal.load(Marshal.dump(operand)) # ??? end end 你能帮我这个吗? 更新 好吧,超级运动员可能不会帮助我,但我仍然想要这样的操作员。 我怎么能(或你)为Ruby创建一个扩展,我可以将其作为模块加载? require ‘deep_copy_operator’ a !?= b = {} # I […]