[英]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
方法访问的内容))不会重复。 因此,您有两个完全不同的对象e1
和e1Dup
,但它们的子对象相同。 在C ++中,您会说这两个指针正在访问相同的内存位置。 要完全复制元素树,您必须在每个子节点上递归调用.dup
,然后在复制的e1Dup
上替换它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.