Lua创建了多个闭包实例

时间:2012-06-11 04:49:32

标签: lua closures lua-api lua-5.2

我在文件中有一些lua代码。我想创建此代码的多个闭包实例,每个闭包实例具有不同的_ENV upvalue。我可以使用luaL_loadfile加载文件并使用不同的表设置第一个up值,N次,以创建N个实例。但这不会加载并编译文件N次吗?

除了没有loadfile

之外,我想要做的是lua相当于以下内容
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)

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

使用IO库将文件加载到字符串中,然后在其上调用loadstring

或者,只需获取一个块,然后在执行之前更改它的env

答案 1 :(得分:1)

每当你在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编译源代码。但是这对编译文件不起作用。