Lua | next的使用
lua_next
lua_next(L,index):先把 表(lua栈 index所指的表), 的当前索引弹出,再把table 当前索引的值弹出,也就是先弹出 table的索引,再弹出table索引的值 举例:
local t = {
["a"] = 1,
["b"] = 2,
["c"] = 3
}
使用lua_next
遍历table t
int traversing(lua_State *L)
{
lua_pushnil(L);
/*此时栈的状态
-------
| -1 nil
| -2 table NUMBER_TABLE
-------
*/
while (lua_next(L, -2))
{
/*此时栈的状态
-------
| -1 value
| -2 key
| -3 table NUMBER_TABLE
-------
*/
if (lua_isnumber(L, -2)) printf("nkey: %d\t", luaL_checkinteger(L, -2));
else if (lua_isstring(L, -2)) printf("skey: %s\t", luaL_checkstring(L, -2));
if (lua_isnumber(L, -1)) printf("nvalue: %d\t", luaL_checkinteger(L, -1));
else if (lua_isstring(L, -1)) printf("svalue: %s\t", luaL_checkstring(L, -1));
/*此时栈的状态
-------
| -1 value
| -2 key
| -3 table NUMBER_TABLE
-------
*/
lua_pop(L, 1);
/*此时栈的状态
-------
| -1 key
| -2 table NUMBER_TABLE
-------
*/
}
lua_pop(L, 1);
/*此时栈的状态
-------
| -1 table NUMBER_TABLE
-------
*/
return 0;
}
lua_next(L, -2) 这个函数的工作过程是:
- 先从栈顶弹出一个
key
- 从栈指定位置的
table
里取下一对 key-value,先将key
入栈,再将value
入栈 - 如果第 2 步成功则返回非 0 值,否则返回 0,并且不向栈中压入任何值, 第 2 步中从
table
里取出"下一对key-value
“是相对于第 1 步中弹出的 key 的。table
里第一对key-value
的前面没有数据,所以先用lua_pushnil()
压入一个nil
充当初始key
。
--完--
- 原文作者: 留白
- 原文链接: https://zfunnily.github.io/2021/05/lua_next/
- 更新时间:2024-04-16 01:01:05
- 本文声明:转载请标记原文作者及链接