1

我可以换一张桌子吗?例如,我无法正常工作:

lua_createtable(L,0,0);
lua_replace(L,2); // is the 2nd parameter of a function call
4

2 回答 2

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

如果您的问题中的代码片段不起作用,那么您在未显示的周围上下文中做错了什么。

于 2014-12-22T23:14:36.050 回答
0

除非将新创建的表作为返回值推送,否则它不会反映在函数外部的变量中,因为 lua 中的参数始终是按值传递的。

完成此操作的唯一方法是不创建新表,而是附加到您开始使用的表中。您希望保持指向原始表的指针不变。

于 2020-11-19T16:00:27.653 回答