加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby:对象深度复制

发布时间:2020-12-17 03:04:28 所属栏目:百科 来源:网络整理
导读:我正在研究一些在 Ruby中深度复制对象的技术(MRI 1.9.3). 我遇到了以下示例,但我不确定#dup方法的实现. 我测试了它并且它确实有效,但是我不理解该方法的逻辑步骤,因此我在自己的代码中使用它并不舒服. 语句@name = @ name.dup是指副本中的iVar吗?怎么样?我
我正在研究一些在 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 object
  end
end

解决方法

这是一个非常薄的,非常具体的“深层复制”实现.它所展示的是在克隆中创建一个独立的@name实例变量,以便修改具有就地操作的名称,不会产生更改克隆的副作用.

通常,深度复制操作对于嵌套数组或散列等内容很重要,但它们也适用于具有引用该类事物的属性的任何对象.

在你的情况下,要使用更强大的dup方法创建一个对象,你应该对每个有问题的属性调用dup,但我认为这个例子有点破碎.它的作用是用原件替换原件中的@name,这可能会破坏您的任何参考.

更好的版本是:

def dup
  copy = super
  copy.make_independent!
  copy
end

def make_independent!
  instance_variables.each do |var|
    value = instance_variable_get(var)

    if (value.respond_to?(:dup))
      instance_variable_set(var,value.dup)
    end
  end
end

这应该具有复制支持dup方法的任何实例变量的效果.这会跳过数字,布尔值和无法复制的内容.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读