这个答案只是为了详细说明我上面的评论。实现您所描述的一个简单想法是在脚本文件中创建该本地表并在最后返回该表。
local Script = {}
Script.test = 5
Script.foo = "bar"
function Script:Update()
end
return Script
这是将 lua 模块放入其自己的命名空间并避免全局范围污染的常用方法。
Script
您可以通过以下方式从堆栈中抓取并使用返回的表:
// load and execute your script
luaL_dofile(L, "script.lua");
// Run Script:Update()
lua_getfield(L, -1, "Update");
lua_pushvalue(L, -2);
lua_call(L, 1, 0);
您可以将上面的代码片段包装到一个函数中,以便更轻松地根据需要多次调用。您甚至可以通过在script.lua
某处缓存已编译的内容来提高效率,以避免每次调用此函数时重新解析和重新创建包装函数。例如:
lua_getfield(L, LUA_REGISTRYINDEX, "cached_script");
if (lua_isnil(L, -1))
{
luaL_loadfile(L, "script.lua");
lua_pushvalue(L, -1);
lua_setfield(L, LUA_REGISTRYINDEX, "cached_script");
}
lua_pcall(L, 0, 0, 0);
// etc.