为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Ruby中创建对象的深层副本?

/ 猿问

如何在Ruby中创建对象的深层副本?

慕瓜9086354 2019-11-15 10:46:53

我进行了一些搜索,发现了有关创建深度复制运算符的一些不同方法和文章。

有没有一种快速,简单(内置)的方法来在Ruby中深度复制对象?字段不是数组或哈希。

使用Ruby 1.9.2。


查看完整描述

3 回答

?
皈依舞

深层副本不是内置在原始Ruby中的,但是您可以通过编组和解组对象来对其进行破解:


Marshal.load(Marshal.dump(@object))

不过,这并不完美,并且不适用于所有对象。一种更强大的方法:


class Object

  def deep_clone

    return @deep_cloning_obj if @deep_cloning

    @deep_cloning_obj = clone

    @deep_cloning_obj.instance_variables.each do |var|

      val = @deep_cloning_obj.instance_variable_get(var)

      begin

        @deep_cloning = true

        val = val.deep_clone

      rescue TypeError

        next

      ensure

        @deep_cloning = false

      end

      @deep_cloning_obj.instance_variable_set(var, val)

    end

    deep_cloning_obj = @deep_cloning_obj

    @deep_cloning_obj = nil

    deep_cloning_obj

  end

end

资源:


http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/43424


查看完整回答
反对 回复 2019-11-15
?
梵蒂冈之花

我创建了一个本机实现来执行红宝石对象的深层克隆。


它比元帅的方法快6至7倍。


https://github.com/balmma/ruby-deepclone


查看完整回答
反对 回复 2019-11-15
?
45度呼吸

有一个本机实现可以执行Ruby对象的深层克隆:ruby_deep_clone


与gem一起安装:


gem install ruby_deep_clone

用法示例:


require "deep_clone"

object = SomeComplexClass.new()

cloned_object = DeepClone.clone(object)

它比元帅的方法快6到7倍,而事件处理冻结的对象也可以。


查看完整回答
反对 回复 2019-11-15
  • 3 回答
  • 0 关注
  • 42 浏览
我要回答

相关问题推荐

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信