zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Lua学习笔记之CAPI遍历Table实现代码

遍历笔记学习代码 实现 Table lua
2023-06-13 09:15:33 时间

Lua通过一个虚拟栈与C的交互,正数索引自底向上取值,负数索引自顶向下取值。

Lua中的Table(表)结构可以使用任何数据作为key进行取值。使用CAPI访问Table中的元素有两种方法:

复制代码代码如下:


lua_getglobal(L,t);
lua_pushinteger(L,k);--这里可以换成其它类型的lua_pushXXXX(L,k)压数据到栈顶作key
lua_gettable(L,-2);

lua_getglobal(L,t);
lua_getfield(L,-1,k);

在结束时,栈上的情况均为:栈顶为t[k],次顶元素为Table类型的t。第二种方法其实是第一种方法在「key为字符串」时的特殊写法。

CAPI遍历Table

复制代码代码如下:


lua_getglobal(L,t);
lua_pushnil(L);
while(lua_next(L,-2)){
/*此时栈上-1处为value,-2处为key*/
lua_pop(L,1);
}

lua_next函数针对-2处(参数指定)的Table进行遍历。弹出-1处(栈顶)的值作为上一个key(为nil时视为请求首个key),压入Table中的下一个key和value。返回值表示是否存在下一个key。

另外在循环中处理值时要记得随时清理栈,否则Table就不在-2了。(也可以考虑在 lua_getglobal 后用 lua_gettop 存下Table的正数索引。)

虽然这是手册中记载的遍历方法,但这种方法在遍历时并没有一定的遍历顺序,于是便又有了下面的方法。

用整数Key进行并不那么完美的遍历

复制代码代码如下:
lua_getglobal(L,t);
len=lua_objlen(L,-1);
for(i=1;i<=len;i++){
   lua_pushinteger(L,i);
   lua_gettable(L,-2);
   /*此时栈顶即为t[i]元素*/
   lua_pop(L,1);
}

这种方法无视了非整数key,但可以保证遍历顺序。如果只关注整数key,可以考虑用这种遍历方法:)