表操作
为了访问或更改表的索引,你需要以某种方式将表放入堆栈。
让我们假设,对于这个例子,你的表是一个名为 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
。
为了清理房间,我已经清除了顶部元素,因此只有两个表格保留在堆栈中。