2

我的游戏引擎的界面是使用标记语言和 Lua 构建的,类似于 HTML 和 javascript。因此,视觉元素将具有用于 UI 事件(例如鼠标移动或单击)的处理程序,并且每次运行处理程序时,引擎将检查它是否已编译,如果尚未编译,则通过luaL_loadstring. Handers 可以通过元素复制或赋值 ( this.onclick = that.onclick) 共享。

如何在运行之前设置一大块lua代码的环境?这个想法是使特定于元素和事件的数据可用于块,并链接到父 UI 元素的环境。 Lua 5.2 changes removed lua_setfenv,所以我不知道如何实现这一点。该函数lua_load允许指定一个环境,但似乎只用于加载代码而不是运行它。

4

1 回答 1

7

参考手册

您可以使用 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应该看起来很熟悉。

于 2013-10-03T20:33:48.067 回答