有很多关于如何在Lua中克隆Lua表的示例,但是我无法找到如何使用本机Lua C API执行此操作的任何示例.我试图用手做两次,但结果却是一个真正的(虽然有效)混乱. 有没有人有关于如何在C
有没有人有关于如何在C API中优雅地执行Lua表的浅表副本的任何提示或链接?
您需要做的是定义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) { /*Create a new table on the stack.*/ lua_newtable(L); /*Now we need to iterate through the table. Going to steal the Lua API's example of this.*/ lua_pushnil(L); while(lua_next(L, index) != 0) { /*Need to duplicate the key, as we need to set it (one pop) and keep it for lua_next (the next pop). Stack looks like table, k, v.*/ lua_pushvalue(L, -2); /*Now the stack looks like table, k, v, k. But now the key is on top. Settable expects the value to be on top. So we need to do a swaparooney.*/ lua_insert(L, -2); /*Now we just set them. Stack looks like table,k,k,v, so the table is at -4*/ lua_settable(L, -4); /*Now the key and value were set in the table, and we popped off, so we have table, k on the stack- which is just what lua_next wants, as it wants to find the next key on top. So we're good.*/ } }
现在我们复制的表位于堆栈的顶部.
基督,Lua API糟透了.