建立树状结构,获得奇怪的重复问题

时间:2017-03-02 22:40:14

标签: ruby tree duplicates

我正在尝试构建一个Web抓取工具,允许我定义如何通过DSL抓取页面。首先编译树(不是二叉树),然后使用该树来刮取页面。

问题是我遇到了一些奇怪的重复问题,尽管代码块增加了被调用三次的字段,不知何故,字段被添加到每个节点(其中有&#39) ;重新是5)。我无法弄清楚这是怎么发生的,所以我想我会问堆栈。

重要的代码是here,我将终端输出设置为.json,以便更容易阅读。

编辑:

我一直在查看哈希的object_ids@data个对象中的容器哈希值(Node)有不同的ID,但fields哈希值在容器哈希内部似乎都共享相同的ID,因此更新一个更新其他ID。

我不确定为什么会发生这种情况,因为我正在复制(现在克隆)我传入初始树节点的init哈希,为什么哈希仍然引用相同的哈希对象。

1 个答案:

答案 0 :(得分:0)

好的,为了解决这个问题,我必须更改设置@data容器中项目的机制,这样它现在基本上每次添加时都会创建一个新的副本,所以现在它看起来像这样:

def set_info(type,name,xpath,meta)
  #see, I have to grab the current hash then merge the new data into it and then overwrite the old hash with the new one :(
  @tree[@tree_pointer].data[type] = @tree[@tree_pointer].data[type].merge({name => {
    xpath: join_xpath(xpath),
    meta: meta
  }})
end

当然不理想,但这是确保ruby停止复制引用并实际创建单独哈希对象的唯一方法,复制问题现在已经消失。

尽管如此,如果有人有更好的方法可以做到这一点,那我就是全部。