繁体   English   中英

为什么在修改.dup方法创建的副本时,原始元素会被更改? Ruby和REXML

[英]Why the original element got changed when I modify the copy created by .dup method? Ruby and 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/>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM