Lua表 - 搜索以字母开头的项目
2021-3-22 10:55:57
收藏:0
阅读:156
评论:2
我有这个表格
animals = {
{sname = "bunny", name = "兔兔 Hase", size = 4, size2 = 8, size3 = 9},
{sname = "mouse", name = "米奇 Mouse", size = 1, size2 = 12, size3 = 22},
{sname = "cow", name = "Die Kuh", size = 30, size2 = 33, size3 = 324
}
这里我可以按列出的条目搜索
for _,v in pairs(animals) do
if v.sname == "bunny" then
print(v.sname, v.name, v.size, v.size2, v.size3)
break
end
end
并得出以下结果:
bunny bunny hase 4 8 9
现在我想通过以单个字母开头的搜索我的表格,例如“b”,显示以字母“b”开头的所有条目,以获得相同的结果?
我没有找到解决方案。您能帮助我吗?
点赞
用户15432638
停一下,我发现了一个问题...
看这里 - 我更喜欢第一个解决方案:
animals = {
{sname = "bunny", name = "bunny hase", size = 4, size2 = 8, size3 = 9},
{sname = "mouse", name = "Micky Mouse", size = 1, size2 = 12, size3 = 22},
{sname = "cow", name = "Die Kuh", size = 30, size2 = 33, size3 = 324}
}
-- 在同一表上设置 __call 元方法
setmetatable(animals,{__call=function(tab,...)
local args={...}
for v,k in pairs(tab) do
if k.sname:find(args[1],1) then print(v,'=',k.sname) end
end
end})
-- 搜索以 U 开头的条目...
-- 应该没有结果,但是...
animals('u')
我得到的结果是: 1 = bunny 2 = mouse
这不应该是结果!
2021-03-24 13:09:26
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

首先:表格
animals需要一个尾随的};-)将它放在
Lua -i控制台中并玩一下...>animals = { {sname = "bunny", name = "bunny hase", size = 4, size2 = 8, size3 = 9}, {sname = "mouse", name = "Micky Mouse", size = 1, size2 = 12, size3 = 22}, {sname = "cow", name = "Die Kuh", size = 30, size2 = 33, size3 = 324} } -- 现在在相同的表格中设置 __call 元方法 >setmetatable(animals,{__call=function(tab,...) local args={...} for key, value in pairs(tab) do if value.sname:find(args[1],1) then print(key,'=',value.sname) end end end}) table: 0x565c4a00 -- 让我们尝试一次 >animals('b') 1 = bunny -- 下一个 >animals('c') 3 = cow -- 最后一个 >animals('m') 2 = mouse使用元表可以把你的东西粘在一起。
另一个好的地方是
__index元方法,它可以存储你需要的所有函数,并且可以像字符串函数一样在字符串上使用。(例如:
value.sname:find(args[1],1))这引导到了 find 应该做的核心。
在第一个例子中,它在整个
sname中查找匹配的模式。检查 Lua 模式,它也可能有用。
如果你的动物中有一头牛、一只乌鸦、一只青蛙和一条鱼,那么只对开头使用
^是否聪明呢?因此构造查找模式:
'^'..args[1]...并且如果你有一个 cow、crow、frog 和 fish,则使用多个字母。
在
__index中使用函数名find的示例>animals = { {sname = "bunny", name = "bunny hase", size = 4, size2 = 8, size3 = 9}, {sname = "mouse", name = "Micky Mouse", size = 1, size2 = 12, size3 = 22}, {sname = "cow", name = "Die Kuh", size = 30, size2 = 33, size3 = 324} } -- 将 find 函数放入 __index >setmetatable(animals,{__index={find=function(tab,...) local args={...} for key, value in pairs(tab) do if value.sname:find('^'..args[1]) then print(key,'=',value.sname) end end end}}) table: 0x565c3db0 -- first >animals:find('c') 3 = cow -- next >animals:find('m') 2 = mouse -- last >animals:find('b') 1 = bunny如果你想打印所有的键值,那么在
find()中扩展print()。