分类: Python/Ruby
2012-03-08 09:55:47
table, 作为Lua中的重要类型, 为数据管理提供了许多便利. 我们可以用C++, 在Lua上下文(Lua_State)中注册table, 以便lua程序可以方便的和C++进行交互.
先来看一段C++代码:
1 2 3 4 5 6 7 | lua_State* pLuaState = luaL_newstate(); luaL_openlibs(pLuaState); lua_createtable(pLuaState, 0, 1); lua_pushcclosure(pLuaState, CallBack, 0); lua_setfield(pLuaState, -2, "Add"); lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math"); |
这里, 我创建了一个Lua table(lua_createtable), 并将C++函数CallBack以"Add"为键值, 注册到新的table中, 然后将table作为全局变量Math注册到当前的上下文中.
这样, 我在lua代码中就可以这样写:
这条语句, 通过执行Math表中的Add, 从而调用到C++中的CallBack函数.
当我们不再需要这个table的时候, 我们使用以下的语句, 将table的引用减少.
1 2 | lua_pushnil(pLuaState); lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math"); |
这两条语句相当于lua中的 Math = nil, 这样, GC就可以回收table和function的资源了.
下面附上完整的C++代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include #pragma comment(lib, "lua51.lib") int CallBack(lua_State* pLuaState) { int a = luaL_checkint(pLuaState, 1); int b = luaL_checkint(pLuaState, 2); lua_pushnumber(pLuaState, a + b); return 1; } int _tmain(int argc, _TCHAR* argv[]) { lua_State* pLuaState = luaL_newstate(); luaL_openlibs(pLuaState); lua_createtable(pLuaState, 0, 1); lua_pushcclosure(pLuaState, CallBack, 0); lua_setfield(pLuaState, -2, "Add"); lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math"); if (luaL_loadfile(pLuaState, "test.lua") || lua_pcall(pLuaState, 0, 0, 0)) { printf("%s\n", lua_tostring(pLuaState, -1)); lua_pop(pLuaState, 1); lua_close(pLuaState); return 0; } lua_pushnil(pLuaState); lua_setfield(pLuaState, LUA_GLOBALSINDEX, "Math"); if (luaL_dostring(pLuaState, "print(Math.Add(100, 10))")) { printf("%s\n", lua_tostring(pLuaState, -1)); lua_pop(pLuaState, 1); lua_close(pLuaState); // 这里加断点调试, 查看控制台输出结果 return 0; } lua_close(pLuaState); return 0; } |