Lua-查找在其中声明全局变量的文件



我想要一个用户提供的配置文件,比如这个

-- file cfg.lua, provided or modifiable by user
cfg = {} -- global table
cfg.string_value = 153 -- supposed to be a string, user mistake
return cfg

然后从某个地方使用它,比如如果配置文件有问题,我可以告诉用户到底哪里出了问题

-- file init.lua
local cfg = require("cfg")
if type(cfg.string_value) ~= "string" then
error("config value 'string_value' expected a string")
end

我希望错误消息告诉用户哪个文件和行中的值是

ERROR:init.lua:6: config value 'string_value' expected a string
LOOK INSIDE cfg.lua: line 5

是否可以从声明变量的位置检索文件和行号?

Lua是动态类型化的。任何变量都可以有任何类型。因此,确保分配正确类型的唯一方法是实际检查它

您可以使用代理表来检查是否分配了所需的类型。这样,每个赋值都会通过一个函数来确保我们有匹配的类型。

您可以为每个属性定义一个类型,也可以只使用其默认值的类型。

您可以使用调试库来获取有关分配发生位置的更多信息https://www.lua.org/manual/5.4/manual.html#6.10

-- simulate loading a module
function require()
local cfg = {
string_value = {type = "string", value = "default"},
table_value = {type = "table", value = {}},
}
local mt = {
__index = function (t,k) return cfg[k].value end,
__newindex = function (t,k,v)
assert(type(v) == cfg[k].type, string.format(
"attempted to assign a %s to config field %s. %s expected!",
type(k), k, cfg[k].type))
print(debug.traceback())
cfg[k].value = v
end
}
local interface = setmetatable({}, mt)
return interface
end

local cfg = require("cfg")
cfg.string_value = "test"
print(cfg.string_value)
cfg.table_value = 4

对于必须是字符串的数字,请使用。。。

-- file cfg.lua, provided or modifiable by user
cfg = {} -- global table
cfg.string_value = tostring(153) -- supposed to be a string
-- or: cfg.string_value = "153"
return cfg

相关内容

  • 没有找到相关文章

最新更新