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