0

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

我想要做的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)

有一个更好的方法吗?

4

2 回答 2

1

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

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

于 2012-06-11T04:55:36.747 回答
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编译源代码。但这不适用于已编译的文件。

于 2012-06-11T08:40:42.957 回答