加载一个文件并返回其环境。

我正在尝试以下操作:(在下面包括()代码)

File1.lua

A = 5

File2.lua

file1 = include(File1.lua)
A = 1

print(A)-- 1
print(file1.A)-- 5

我已经在这里找到了我要找的东西,但在lua 5.1中: [Loadfile without polluting global environment](https://stackoverflow.com/questions/9540732/lua-loadfile-without-polluting-global-environment? answertab = votes#tab-top)

但是我无法使它在5.2中工作,

函数包括(scriptfile)
local env = setmetatable({},{__index = _G})
assertpcallsetfenvassertloadfile(scriptfile)),env)))
setmetatable(env,nil)
返回env
end

使用具有已注册版本的loadfile的C++,因此我尝试不修改函数调用。这可行吗? 无论我尝试什么都会破坏或令env为null。

点赞
用户1847592
用户1847592

File2.lua

function include(scriptfile)
    local env = setmetatable({}, {__index=_G})
    assert(loadfile(scriptfile, 't', env))()
    return setmetatable(env, nil)
end

file1 = include'File1.lua'
A = 1

print(A)       -- 1
print(file1.A) -- 5

include(scriptfile) 函数会加载指定的 Lua 脚本文件。它会创建一个新的环境表,使它的 __index 元方法指向全局环境表。这就使得我们可以在新的环境中运行脚本文件,而不会影响全局环境。

脚本文件执行完毕后,我们将环境表返回,并将其 metatable 设置为 nil,以防止在其他地方被意外修改。

在这个示例中,我们加载了 "File1.lua",并将返回的环境表存储在 "file1" 变量中。接着我们在全局环境表中创建了一个 "A" 变量并将其值设置为 1。

最后,我们测试了全局环境表中的 "A" 变量和从文件 "File1.lua" 中加载的 "file1.A" 变量的值,以确保它们都被正确地设置了。

2013-07-16 10:33:31