0

我刚刚在 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/>
4

1 回答 1

1

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

于 2014-05-26T22:23:55.733 回答