我可以更换桌子吗?例如我无法做到这一点:
lua_createtable(L,0,0);
lua_replace(L,2); // is the 2nd parameter of a function call
答案 0 :(得分:0)
您可以lua_replace
给定索引处的任何lua值,顶部的任何值。这是一个简单的单元测试,它将您的新空表移动到位置2,替换正常情况:
int test_replace(lua_State *L)
{
lua_getglobal(L, "_VERSION");
lua_getglobal(L, "os");
lua_getglobal(L, "os");
printstack(L);
lua_createtable(L, 0, 0);
lua_replace(L, 2);
printstack(L);
return 0;
}
一个简单的printstack
来显示lua堆栈上的内容:
const char *lprint =
"function lprint(...)"
" local _, arg2 = ..."
" print(...)"
" return ..."
" end";
int printstack(lua_State *L)
{
const int argc = lua_gettop(L);
lua_getglobal(L, "lprint");
lua_insert(L, 1);
lua_call(L, argc, argc);
return argc;
}
现在,如果您运行test_replace
,例如
luaL_dostring(L, lprint);
lua_pushcfunction(L, test_replace);
lua_call(L, 0, 0);
可能的输出:
Lua 5.2表:00431A10表:00431A10
Lua 5.2表:00431DD0表:00431A10
如果您问题中的代码段不起作用,那么您在周围环境中做错了,而您没有显示。
答案 1 :(得分:0)
除非将新创建的表作为返回值推送,否则它不会反映在函数外部的变量中,因为lua中的参数始终按值传递。
完成此操作的唯一方法是不创建新表,而是追加到您开始使用的表中。您想保持指向原始表的指针不变。