从参考手册:
您可以使用 load(或 loadfile)来加载具有不同环境的块。(在 C 中,您必须加载块,然后更改其第一个上值的值。)
设置 upvalues 是用lua_setupvalue
. 因此,首先加载您的代码,然后推送新环境并lua_setupvalue
以您之前调用的相同方式调用lua_setfenv
:
luaL_loadfile(L, "file.lua"); /* load and compile handler */
lua_getglobal(L, "my_environment"); /* push environment onto stack */
lua_setupvalue(L, -2, 1); /* pop environment and assign to upvalue#1 */
/* any other setup needed */
lua_pcall(L, ...); /* call handler */
另外,从你的问题的结尾:
该函数lua_load
允许指定一个环境,但似乎只用于加载代码而不是运行它。
实际上并非如此。load
(Lua 函数)允许您指定环境,但lua_load
(C 函数)不能。
此外,虽然它“仅用于加载代码,而不是运行它”,但这与luaL_loadstring
- 实际上luaL_loadstring
只是它的包装器相同。lua_load
是一个较低级别的 API 函数,可用于实现自定义加载器(例如,通过网络加载代码,或从压缩文件加载)。因此,如果您在使用luaL_loadstring
运行代码之前已经习惯了使用 加载代码lua_pcall
,那么您lua_load
应该看起来很熟悉。