lua模块

xiaoxiao2021-02-28  156

来公司一年多了,一直在用lua做开发。公司有封装好的lua接口,没有源码,所以只能自己研究相关接口的大概原理。 关于lua模块,网上有很多博文,大概的实现方式无外乎是,在单独的lua文件定义一个table,然后通过return 返回。用的时候通过require 加载。这样可行,但是有点繁杂。 我们知道模块是通过table方式存在。可以通过把table注册到全局表,在需要用到的地方再取出,这就很方便了 简单实现,直接修改lua源码,封装两个接口。在lbaselib.c中添加以下代码: static int lua_GetGlobalObject(lua_State *L) { const char *name = luaL_checkstring(L,-1); lua_getglobal(L,name); return 1; } static int lua_SetGlobalObject(lua_State *L) { int argCount = lua_gettop(L); const char *name = luaL_checkstring(L,-2); lua_setglobal(L,name); return 1; } 修改数组: static const luaL_Reg base_funcs[] = { {"assert", luaB_assert}, {"collectgarbage", luaB_collectgarbage}, {"dofile", luaB_dofile}, {"error", luaB_error}, {"getmetatable", luaB_getmetatable}, {"ipairs", luaB_ipairs}, {"loadfile", luaB_loadfile}, {"load", luaB_load}, {"SetGlobalObject", lua_SetGlobalObject}, {"GetGlobalObject", lua_GetGlobalObject}, 。。。。。。。 } 然后重新编译,生成静态库。这样在lua代码中就可以使用SetGlobalObject,GetGlobalObject两个接口。 新建两个lua模块,moduleA.lua local moduleA = {} function moduleA.Add(va,vb) print("enter module A function") return va + vb end SetGlobalObject("myModuleA",moduleA) local tb = GetGlobalObject("myModuleB") local ret = tb.Sub(9,7) print("ret",ret) -----------------------------------------moduleB.lua------------- local moduleB = {} function moduleB.Sub(va,vb) print("enter module B sub function") return va - vb end SetGlobalObject("myModuleB",moduleB) ----------main.cpp------------------ void main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L,"D:/source/LuaCppTest/LuaCppTest/Debug/moduleB.lua"); luaL_dofile(L,"D:/source/LuaCppTest/LuaCppTest/Debug/moduleA.lua"); lua_close(L); system("pause"); }
转载请注明原文地址: https://www.6miu.com/read-31235.html

最新回复(0)