Lua教程(二十一):编写C函数的技巧
1.数组操作:
在Lua中,“数组”只是table的一个别名,是指以一种特殊的方法来使用table。出于性能原因,Lua的CAPI为数组操作提供了专门的函数,如:
voidlua_rawgeti(lua_State*L,intindex,intkey); voidlua_rawseti(lua_State*L,intindex,intkey);
以上两个函数分别用于读取和设置数组中的元素值。其中index参数表示待操作的table在栈中的位置,key表示元素在table中的索引值。由于这两个函数均为原始操作,比涉及元表的table访问更快。通常而言,作为数组使用的table很少会用到元表。
见如下代码示例和关键性注释:
#include<stdio.h> #include<string.h> #include<lua.hpp> #include<lauxlib.h> #include<lualib.h>
extern"C"intmapFunc(lua_State*L) { //检查Lua调用代码中传递的第一个参数必须是table。否则将引发错误。 luaL_checktype(L,1,LUA_TTABLE); luaL_checktype(L,2,LUA_TFUNCTION); //获取table中的字段数量,即数组的元素数量。 intn=lua_objlen(L,1); //Lua中的数组起始索引习惯为1,而不是C中的0。 for(inti=1;i<=n;++i){ lua_pushvalue(L,2); //将Lua参数中的function(第二个参数)的副本压入栈中。 lua_rawgeti(L,1,i); //压入table[i] lua_call(L,1,1); //调用function(table[i]),并将函数结果压入栈中。 lua_rawseti(L,1,i); //table[i]=函数返回值,同时将返回值弹出栈。 }
//无结果返回给Lua代码。 return0; }