我在文件中有一些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)
有更好的方法吗?
答案 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
编译源代码。但是这对编译文件不起作用。