1

我正在尝试使用 lua c api 浏览全局命名空间及其所有内容。我遇到的一个问题是表格中的自我引用。我正在使用扁平表方法来确定是否存在条目,但是对于嵌套的数字表,这会失败,例如:

a = {[1] = {[1]={[1]=true}}}

其中 1 的键名将错误地触发重复条目,因为它多次出现。为了避免这种情况,我采用了使用 lua_topointer 并将引用存储在映射中并像这样检查的方法(其中 varUnit 只是一个跟踪已加载的变量的结构):

    lua_pushvalue(L, -1);
    const void* kp = lua_topointer(L, -1);
    var->kpointer = kp;
    varUnit->addPointer(kp);
    lua_pop(L, 1);
    lua_pushvalue(L, -2);
    const void* vp = lua_topointer(L, -1);
    var->vpointer = vp;
    varUnit->addPointer(vp);
    lua_pop(L, 1);

然后我稍后检查该变量是否存在,如果存在,我停止走下桌子。但是,在处理自引用表时,这并没有阻止无限递归。这里有更好的方法/一些有缺陷的逻辑吗?给定表的第二次遇到会给我一个不同的指针吗?我见过多种基于 lua 的爬取表的方法,但不是任何基于 c 的。

编辑:关闭的问题,是一个愚蠢的错误,我在将指针分配给变量之前检查指针是否重复。

4

1 回答 1

0

我不确定“使用扁平表格方法”是什么意思;但是在您的代码中的某处,您必须检查给定值是否是一个表格(以便您可以在其中检查)。最简单的方法是保留一组所有已访问过的表,对于您找到的表,首先检查它是否已经存在,这样您就不会爬两次。

于 2013-06-26T14:33:21.713 回答