Lua - 查找声明全局变量的文件
2021-6-25 9:50:53
收藏:0
阅读:110
评论:2
我想要有一个用户提供的配置文件,像这样
-- file cfg.lua,用户提供或可修改
cfg = {} -- 全局表
cfg.string_value = 153 -- 应该是字符串,用户犯错了
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
能否从声明变量的地方检索文件和行号呢?
点赞
用户2858170
Lua 是动态类型语言,任何变量可以是任何类型。因此,唯一确保正确类型被赋值的方法是实际检查它。
您可以使用代理表来检查是否分配了预期的类型。这样,每个赋值都将通过一个函数,该函数确保我们有匹配的类型。
您可以为每个属性定义类型,也可以仅使用其默认值的类型。
您可以使用 debug 库获取更多有关分配发生位置的信息 https://www.lua.org/manual/5.4/manual.html#6.10
-- 模拟加载模块
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
2021-06-25 09:22:18
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
对于必须是字符串的数字,使用...
-- 文件 cfg.lua,由用户提供或可修改 cfg = {} -- 全局表 cfg.string_value = tostring(153) -- 应该是一个字符串 -- 或者:cfg.string_value = "153" return cfg