当我修改.dup方法创建的副本时,为什么原始元素发生了变化? Ruby和REXML

时间:2014-05-26 22:17:34

标签: ruby rexml

我刚刚在irb中测试了以下步骤并得到了一些奇怪的东西:

require 'rubygems'
require 'rexml/document'  
include REXML

e1=Element.new("E1")
e2=Element.new("E2")
e1.add_element(e2)

e1Dup=e1.dup
puts e1
puts e1Dup

e1.delete_element(e1.elements[1])
puts e1
puts e1Dup

我只想要对e1进行更改,但结果显示两个元素都已更改。怎么会发生这种情况?结果如下:

<E1><E2/></E1>
<E1><E2/></E1>
<E1/>
<E1/>

1 个答案:

答案 0 :(得分:1)

Ruby的dup函数只对对象进行浅层复制。其内部数据(例如存储在属性中的数据(这是elements方法正在访问的内容)不会重复。所以你有两个完全不同的对象e1e1Dup,但他们的孩子是相同的。在C ++中,您可以说两个指针正在访问相同的内存位置。要完全复制元素树,您必须在每个子节点上递归调用.dup并在重复的e1Dup上替换它们。