在一定范围内执行加载的Lua个文件
Execute Loaded Lua files in a certain scope
我正在使用 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
,必须记住末尾的 return 和 table。如果有某种方法可以使 conf.lua
在某种自定义范围内执行,那就太好了。
而不是使用 dofile
, simply use loadfile
。
loadfile
allows you to specify the environment 加载的块将在其中执行。将其设置为空 table 允许将 upvalues 放置在 table 中.
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
uses similar rules as load
,只是它从文件或 stdin
加载块,而不是从字符串或字符串构建函数加载块。
注意setfenv
is required for backwards compatibility with Lua 5.1。在执行加载的块之前,您将使用以下内容(或类似内容)。
if setfenv then
setfenv(chunk, env)
end
参见 §8.1 – Changes in the Language of the Lua 5.2 Reference Manual。
最后,考虑 运行 您的块处于 保护模式 ,使用 pcall
,这样配置文件就不会使您的主程序崩溃。
我正在使用 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
,必须记住末尾的 return 和 table。如果有某种方法可以使 conf.lua
在某种自定义范围内执行,那就太好了。
而不是使用 dofile
, simply use loadfile
。
loadfile
allows you to specify the environment 加载的块将在其中执行。将其设置为空 table 允许将 upvalues 放置在 table 中.
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
uses similar rules as load
,只是它从文件或 stdin
加载块,而不是从字符串或字符串构建函数加载块。
注意setfenv
is required for backwards compatibility with Lua 5.1。在执行加载的块之前,您将使用以下内容(或类似内容)。
if setfenv then
setfenv(chunk, env)
end
参见 §8.1 – Changes in the Language of the Lua 5.2 Reference Manual。
最后,考虑 运行 您的块处于 保护模式 ,使用 pcall
,这样配置文件就不会使您的主程序崩溃。