添加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模块名称在执行函数前已压入栈中 栈地址 1
luaL_newlib(L, module_lib); //创建table,当前栈地址为 2
lua_newtable(L);//创建table 当前栈地址为3
luaL_setfuncs(L,mod0_lib,0);//给table添加函数列表
lua_pushinteger( L, 1002 );//顶部压栈整数 当前栈4
lua_setfield( L, 3, "id" );//给mod0 table中id赋值栈顶数据并移除栈顶数据 当前栈3
lua_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");
//当前栈顶为2
lua_pushinteger( L, 1001 );
lua_setfield( L, 2, "id" );
//栈顶为2
//退出时必须保证栈顶table不变 关联函数luaL_requiref就可以知道原因
return 1;
}
lua代码
for k, v in pairs(module) do
if type(v) == "table" then
print(k, ".................")
for k0, v0 in pairs(v) do
print("", k0, v0)
end
else
print(k, v)
end
end
执行结果
mod2 .................
fun1 function: 080226ab
status false
id 1003
fun2 function: 080226ab
fun function: 080226ab
id 1001
mod1 .................
fun1 function: 080226ab
status false
id 1002
fun2 function: 080226ab