Lua创建多个闭包实例。

我有一个包含 lua 代码的文件。我想创建多个闭包实例,每个实例都具有不同的 _ENV upvalue。我可以使用 luaL_loadfile 加载文件并将第一个 upvalue 设置 N 次,每次使用不同的表来创建 N 个实例。但是这样不是会 N 次加载和编译文件吗?

我想要做的 lua 等价于以下代码,不过不使用 loadfile

func_list = {}

for i = 1, 10 do
    local new_env = {hello=i, print=print}
    func_list[i] = loadfile("Code.lua", "t", new_env)
end

for i = 1, 10 do
    func_list[i]()
end

------ Code.lua ------
print(hello*hello)

有更好的方法吗?

点赞
用户298661
用户298661

使用 IO 库将文件加载到字符串中,然后调用 loadstring 函数执行它。

或者,仅获取其中一组,然后在执行前更改其环境。

2012-06-11 04:55:36
用户221509
用户221509

每当你在 Lua 中加载一个字符串/文件时,你得到的返回值是一个要调用的函数,以实际运行文件。load所做的就是一些额外的处理来设置_ENV

但是,没有什么可以阻止你自己设置_ENV。你可以使用以下代码完成此操作:

-- Code.lua --
_ENV = ...
print(hello * hello)

然后,你可以只加载/编译文件一次,并像下面这样使用多个实例:

local code = loadfile("Code.lua")

env_list = {}
for i = 1, 10 do
    local new_env = {hello=i, print=print}
    code(new_env)
    env_list[i] = new_env
end

如果你不想让用户在每个文件中编写_ENV = ...,你可以将文件加载到一个字符串中,自己添加该行并使用load编译源代码。但这对编译后的文件不起作用。

2012-06-11 08:40:42