C:从呼叫中替换表

时间:2014-11-01 22:07:39

标签: c lua lua-table lua-api

我可以更换桌子吗?例如我无法做到这一点:

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

2 个答案:

答案 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中的参数始终按值传递。

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