作者:手机用户248覀9795477 | 来源:互联网 | 2023-09-23 15:32
添加lua模块一般是用到一级路劲下的函数。类似math.sqrt(2)。但有些场景下一个大模块下会有很多小模块,如下。mod.mod0.fun(),mod.mod1.fun()实现
添加lua模块一般是用到一级路劲下的函数。类似 math.sqrt(2)。
但有些场景下一个大模块下会有很多小模块,如下。
mod.mod0.fun(),mod.mod1.fun()
实现代码如下:
c
static int mod_fun(lua_State *L)
{return 0;
}static const luaL_Reg mod0_lib[] =
{{"fun1", mod_fun},{"fun2", mod_fun},{"status",NULL},{NULL, NULL}
};
static const luaL_Reg mod2_lib[] =
{{"fun1", mod_fun},{"fun2", mod_fun},{"status",NULL},{NULL, NULL}
};
static const luaL_Reg module_lib[]=
{{"mod1",NULL},{"mod2",NULL},{"fun",mod_fun},{NULL,NULL},
};static int luaopen_modlib(lua_State *L)
{//mod模块名称在执行函数前已压入栈中 栈地址 1luaL_newlib(L, module_lib); //创建table,当前栈地址为 2lua_newtable(L);//创建table 当前栈地址为3luaL_setfuncs(L,mod0_lib,0);//给table添加函数列表lua_pushinteger( L, 1002 );//顶部压栈整数 当前栈4lua_setfield( L, 3, "id" );//给mod0 table中id赋值栈顶数据并移除栈顶数据 当前栈3lua_setfield(L, 2, "mod1");//给mod table中mod1赋值为上栈顶table 并移除//当前栈顶为2 lua_newtable(L);luaL_setfuncs(L,mod2_lib,0);lua_pushinteger( L, 1003 );lua_setfield( L, 3, "id" );lua_setfield(L, 2, "mod2");//当前栈顶为2lua_pushinteger( L, 1001 );lua_setfield( L, 2, "id" );//栈顶为2 //退出时必须保证栈顶table不变 关联函数luaL_requiref就可以知道原因return 1;
}
lua代码
for k, v in pairs(module) doif type(v) == "table" thenprint(k, ".................")for k0, v0 in pairs(v) doprint("", k0, v0)endelseprint(k, v)end
end
执行结果
mod2 .................fun1 function: 080226abstatus falseid 1003fun2 function: 080226ab
fun function: 080226ab
id 1001
mod1 .................fun1 function: 080226abstatus falseid 1002fun2 function: 080226ab