如何在不出错的情况下访问深度嵌套的表?
2014-5-21 11:3:42
收藏:0
阅读:102
评论:2
对于一个深度嵌套表内的字段,例如text.title.1.font。即使您使用
if text.title.1.font then ... end
如果表的任何一级实际上不存在,则会导致类似于“尝试对全局变量'text'进行索引(一个nil值)”的错误。当然,可能会尝试检查表的每个级别的存在,但这似乎相当麻烦。我想知道是否有一种安全和更漂亮的方法来处理这种情况,即在引用此类对象时,空值将是值,而不会触发错误?
点赞
用户3574628
为了避免引入许多错误,做到这一点的方法是明确地告诉 Lua 哪些表的哪些字段默认应该是表。可以使用元表来实现。以下是一个示例,但实际上应该根据您希望表的结构如何进行自定义。
-- 这个元表旨在通过保持默认表为空来捕捉错误。
local default_mt = {
__newindex =
function()
error(
'This is a default table. You have to make nested tables the old-fashioned way.')
end
}
local number_mt = {
__index =
function(self, key)
if type(key) == 'number' then
return setmetatable({}, default_mt)
end
end
}
local default_number_mt = {
__index = number_mt.__index,
__newindex = default_mt.__newindex
}
local title_mt = {__index = {title = setmetatable({}, default_number_mt)}}
local text = setmetatable({}, title_mt)
print(text.title[1].font)
2014-05-21 17:59:45
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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中获取用户配置主目录的跨平台方法
Egor 建议
debug.setmetatable(nil, {__index = function()end})是最容易应用的方法。请注意,它没有词法作用域,所以一旦启用,它将一直处于“开”状态,这可能会对代码的其他部分产生意想不到的影响。请参见 this thread 以了解讨论和其他一些替代方法。还要注意,
text.title.1.font应该改为text.title[1].font或text.title['1'].font(这两者并不相同)。另一个更详细但仍可用的替代方法是:
if (((text or {}).title or {})[1] or {}).font then ... end