在特定范围内执行Loaded Lua文件

时间:2016-10-27 00:52:25

标签: lua lua-5.3

我使用Lua作为项目矿的配置格式。让我们假设我有以下人为设想的例子,我们打电话给conf.lua

title = "Lorem Ipsum"
author = "John Doe"
date = "01 January 2000"

现在,我当然可以这样加载这个文件:

dofile("conf.lua")

然而,问题是这些定义是在全局命名空间中设置的,我不想这样做。此外,它使得难以整体访问不同的变量(例如,在配置变量集上循环)。一种解决方案是像这样重写conf.lua

local conf = {
    title = "Lorem Ipsum",
    author = "John Doe",
    date = "01 January 2000"
}

return conf

然后使用以下代码加载conf.lua

local configuration = dofile("conf.lua")

然而,这是不理想的,我认为显而易见的原因。它要求我的用户跟踪逗号,必须写local,必须记住最后返回表。如果有某种方法可以使conf.lua使用某种自定义范围执行,那会更好。

1 个答案:

答案 0 :(得分:4)

不要使用dofile,只需使用loadfile

loadfile允许您指定将在其中执行加载的块的environment。将其设置为空表允许将 upvalues 放置在该表中。

local function load_conf ()
    local env = {}

    local chunk, err = loadfile('conf.lua', 'bt', env)

    if not err then
        chunk()
    end

    return env, err
end
local conf, conf_err = load_conf()

print(conf_err)
print(conf.title, conf.author, conf.date)

loadfile使用与load类似的规则,除了它从文件或stdin加载块,而不是从字符串或字符串构建函数加载。

请注意,向后兼容setfenv需要Lua 5.1。在执行加载的块之前,您将使用以下(或类似的东西)。

if setfenv then
    setfenv(chunk, env)
end

请参阅§8.1 – Changes in the LanguageLua 5.2 Reference Manual

最后,考虑使用pcall保护模式中运行您的块,以便配置文件不会使您的主程序崩溃。