表操作

为了访问或更改表的索引,你需要以某种方式将表放入堆栈。
让我们假设,对于这个例子,你的表是一个名为 tbl 的全局变量。

获取特定索引的内容:

int getkey_index(lua_State *L)
{
  lua_getglobal(L, "tbl");    // this put the table in the stack
  lua_pushstring(L, "index"); // push the key to access
  lua_gettable(L, -2);        // retrieve the corresponding value; eg. tbl["index"]

  return 1;                   // return value to caller
}

正如我们所看到的,你所要做的就是将表推入堆栈,推送索引并调用 lua_gettable。 -2 参数表示该表是堆栈顶部的第二个元素。
lua_gettable 触发元方法。如果你不想触发元方法,请改用 lua_rawget。它使用相同的参数。

在特定索引处设置内容:

int setkey_index(lua_State *L)
{
  // setup the stack
  lua_getglobal(L, "tbl");
  lua_pushstring(L, "index");
  lua_pushstring(L, "value");
  // finally assign the value to table; eg. tbl.index = "value"
  lua_settable(L, -3);

  return 0;
}

获取内容的练习相同。你必须推送堆栈,推送索引,然后将值推入堆栈。之后,你调用 lua_settable。 -3 参数是表中堆栈的位置。要避免触发元方法,请使用 lua_rawset 而不是 lua_settable。它使用相同的参数。

将内容从表转移到另一个表:

int copy_tableindex(lua_State *L)
{
    lua_getglobal(L, "tbl1"); // (tbl1)
    lua_getglobal(L, "tbl2");// (tbl1)(tbl2)
    lua_pushstring(L, "index1");// (tbl1)(tbl2)("index1")
    lua_gettable(L, -3);// (tbl1)(tbl2)(tbl1.index1)
    lua_pushstring(L, "index2");// (tbl1)(tbl2)(tbl1.index1)("index2")
    lua_pushvalue(L, -2); // (tbl1)(tbl2)(tbl1.index1)("index2")(tbl1.index1)
    lua_settable(L, -4);// (tbl1)(tbl2)(tbl1.index1)
    lua_pop(L, 1);

    return 0;
}

现在我们正在把我们在这里学到的所有知我把堆栈内容放在评论上,这样你就不会迷路。

我们将两个表放入堆栈,将表 1 的索引推入堆栈,并获取 tbl1.index1 的值。注意关于 gettable 的 -3 参数。我正在查看第一个表(从顶部开始的第三个)而不是第二个表。然后我们推送第二个表的索引,将 tbl1.index1 复制到堆栈的顶部,然后在顶部的第 4 个项目上调用 lua_settable

为了清理房间,我已经清除了顶部元素,因此只有两个表格保留在堆栈中。