2

我正在使用 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使用某种自定义范围执行,那将是一件好事。

4

1 回答 1

5

而不是使用dofile,只需使用loadfile.

loadfile允许您指定将在其中执行加载的块的环境。将其设置为空表允许将 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 节 - Lua 5.2 参考手册语言更改


最后,考虑在保护模式下运行你的块,使用pcall,这样配置文件就不会让你的主程序崩溃。

于 2016-10-27T01:01:34.783 回答