在 Lua C API 中克隆一个 Lua 表

有很多关于如何在 Lua 中克隆 Lua 表的例子,但我无法找到任何关于如何在原生 Lua C API 中完成此操作的例子。我尝试过两次手动完成,但最终结果很混乱(尽管可以工作)。

有没有人有关于如何在 C API 中优雅地完成浅拷贝的 Lua 表的提示或链接?

原文链接 https://stackoverflow.com/questions/4535152

点赞
stackoverflow用户298661
stackoverflow用户298661

你需要做的是定义 Lua 函数,然后将其拆分成相关的 API 调用。

shallow_copy = function(tab)
    local retval = {}
    for k, v in pairs(tab) do
        retval[k] = v
    end
    return retval
end

因此,我们需要取出栈上表的索引和 lua_State。

void shallow_copy(lua_State* L, int index) {

/*在堆栈上创建一个新表*/

        lua_newtable(L);

/*现在我们需要遍历该表。
借鉴 Lua API 的示例。*/

        lua_pushnil(L);
        while(lua_next(L, index) != 0) {
/*需要复制键,因为我们需要设置它
(一个弹出) 并保留它给 lua_next (下一个弹出)。堆栈看起来像 table, k, v。*/

            lua_pushvalue(L, -2);
/*现在堆栈看起来像 table, k, v, k。
但是现在键在顶部。Settable 要求值在顶部。所以我们
需要交换键和值。*/

            lua_insert(L, -2);

    /*现在我们只需要设置它们。堆栈看起来像 table,k,k,v,所以表在-4处*/

    lua_settable(L, -4);

/*现在键和值已设置到表中,我们弹出它,所以我们有
table, k 在堆栈上——这正是 lua_next 想要的,因为它想要查找
下一个键在顶部。所以我们很好。*/

        }
    }

现在,我们复制的表位于堆栈顶部。

该死,Lua API 真难懂。

2010-12-26 21:14:31