我使用 Lua 作为我的项目的配置格式。假设我有以下人为示例,我们将调用conf.lua:
title = "Lorem Ipsum"
author = "John Doe"
date = "01 January 2000"
Run Code Online (Sandbox Code Playgroud)
现在,很简单,我当然可以像这样加载这个文件:
dofile("conf.lua")
Run Code Online (Sandbox Code Playgroud)
但是,问题在于这些定义是在全局命名空间中设置的,这是我不想要的。此外,这使得访问不同的变量作为一个整体变得困难(例如循环配置变量集)。一种解决方案是conf.lua像这样重写:
local conf = {
title = "Lorem Ipsum",
author = "John Doe",
date = "01 January 2000"
}
return conf
Run Code Online (Sandbox Code Playgroud)
依次加载conf.lua以下代码:
local configuration = dofile("conf.lua")
Run Code Online (Sandbox Code Playgroud)
但是,由于我认为显而易见的原因,这并不理想。它要求我的用户跟踪逗号,必须写local,必须记住在最后返回表。如果有某种方法可以conf.lua使用某种自定义范围来执行,那将会是一件好事。
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
Run Code Online (Sandbox Code Playgroud)
local conf, conf_err = load_conf()
print(conf_err)
print(conf.title, conf.author, conf.date)
Run Code Online (Sandbox Code Playgroud)
loadfile使用与 类似的规则load,不同之处在于它从文件或 加载块stdin,而不是从字符串或字符串构建函数加载。
请注意,这setfenv是与Lua 5.1向后兼容所必需的。在执行加载的块之前,您将使用以下(或类似的)。
if setfenv then
setfenv(chunk, env)
end
Run Code Online (Sandbox Code Playgroud)
最后,考虑在保护模式下运行块,使用pcall,以便配置文件不会使您的主程序崩溃。