打破两个对象之间的引用

时间:2014-09-16 20:10:31

标签: ruby

我已经挣扎了几个小时。

我试图打破两个对象之间的链接,这样我就可以编辑一个而不影响另一个,但是dup根本不起作用。

当我尝试dup Nokogiri :: XML :: NodeSet时,它为我提供了一个与原始文件不同object_id的对象,但是当我修改副本时,它会影响到原本的! Ruby中有没有办法打破两个对象之间的联系?

def copy(collection)
  body = @doc.xpath("//w:body")
  children = @doc.xpath("//w:body").children
  body.children.map(&:remove)

  collection.each do |record|

    puts "it appears child is forever affected #{children}"
    clone = children.dup

    clone = Nokogiri::XML::NodeSet.new(@doc, clone)
    parse_nodes clone, record
    body.first << clone.to_xml
  end
end

1 个答案:

答案 0 :(得分:0)

你可以尝试像这样创建自己的NodeSet

dup_node_set = Nokogiri::XML::NodeSet.new(@doc, children.to_a.map(&:dup))

不确定这对你来说是否足够深,尽管你的方法是递归的,我认为应该这样。

这样做是将children NodeSet转换为Array,然后在内部的每个dup上调用element并将其传递给新{ {1}}。