【问题标题】:Loading a file and returning its environment加载文件并返回其环境
【发布时间】:2023-04-02 04:33:01
【问题描述】:

我正在尝试执行以下操作:(以下包含()代码)

文件1.lua

A = 5

文件2.lua

file1 = include(File1.lua)
A = 1

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

我已经找到了我正在寻找的东西,但在 lua 5.1 中: Loadfile without polluting global environment

但我无法让它在 5.2 中工作,

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

在 C++ 中使用它,并带有一个注册版本的加载文件,所以我试图不修改函数调用。这可能吗? 无论我尝试中断或 env 为空。

【问题讨论】:

    标签: lua env lua-5.2 lua-loadfile


    【解决方案1】:

    文件2.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
    

    【讨论】:

    • 谢谢!我认为这样的任何解决方案都行不通,因为我使用的是我自己的 loadfile 版本,但我对它的包装方式的理解是错误的......
    • 断言 pcall 没有任何意义。
    • 我明白 daurnimator 是什么意思。如果您打算让格式错误的脚本失败,为什么不定期调用它而不是遍历整个 assert(pcall 业务?
    • @daurnimator - 确实。谢谢,已修复。
    猜你喜欢
    • 2016-10-19
    • 2020-08-17
    • 2017-07-09
    • 2018-11-03
    • 1970-01-01
    • 2021-05-05
    • 2017-11-17
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多