元表和元表?
2011-8-26 4:24:42
收藏:0
阅读:114
评论:3
我正在尝试在我的表中制作一个__index函数,它可以处理它接收到的所有字段。我想要做的是,如果我以以下方式调用表格
mytable.str1.str2.str3
我应该能够返回表格
{"str1", "str2", "str3"}
请注意,str1、str2和str3未定义,它们只是字符串。我不是在尝试创建子表str1、str2,我只想让__index查看第一个句点之后的所有内容。
不幸的是,我所拥有的似乎只捕获到str1,并抱怨“尝试对字段'str1'进行索引(空值)”
有人知道如何做到这一点吗?
原文链接 https://stackoverflow.com/questions/7164316
点赞
stackoverflow用户221509
正如 Nicol 所说,你不能直接在 Lua 中做到这一点。然而,通过返回精心制作的表格,你可以实现类似于你想要的结果。参考 Lua-users Wiki 上的 AutomagicTables 获得灵感。
2011-08-23 17:34:40
stackoverflow用户63791
我不确定你为什么要这样做,但是下面是如何实现的。注释解释了这个技巧,但基本上你需要一个第二个元表来处理从第一次调用__index元方法返回的表。
如果这不清楚,请让我知道,我可以详细解释一下。
-- 这个元表将新的键附加到自身,然后返回自身
stringtablemeta = {}
function stringtablemeta.__index(self, key)
table.insert(self, key)
return self
end
-- 对评论中的问题的回答:
function stringtablemeta.__tostring(self)
local str = ""
for i, v in ipairs(self) do
if i > 1 then str = str .. "-" end
str = str .. v
end
return str
end
-- 这个元表创建一个新表,并将 stringtablemeta 作为其元表
mytablemeta = {}
function mytablemeta.__index(self, key)
local temp = { key }
setmetatable(temp, stringtablemeta)
return temp
end
-- 将 mymetatable 作为 mytable 的元表。这将使其在对其进行索引时,
-- 调用 mytablemeta.__index 方法。
--
-- 它将返回一个具有单个字符串 key 的 talb。该表将有自己的元表 stringmetatable,
-- 导致其通过自身的 __index 元方法附加调用它的键。
mytable = {}
setmetatable(mytable, mytablemeta)
test = mytable.str1.str2.str3
for k, v in pairs(test) do
print(k, v)
end
2011-08-26 06:01:28
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
它无法这样做。这要求每个表都有一个元表。
mytable
是一个表。str1
是一个_不同的_ 表。你可以通过这个方式完成相同的事情:local temp = mytable.str1 temp.str2.str3
对于 Lua 来说,这些是等价的。因此,了解每个阶段所做的事情的唯一方法是给它们所有一个特殊的元表。如何将不同的值连接成一个表是您需要自行研究的。