Lua表 - 搜索以字母开头的项目

我有这个表格

    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”开头的所有条目,以获得相同的结果?

我没有找到解决方案。您能帮助我吗?

点赞
用户11740758
用户11740758

首先:表格 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()

2021-03-22 11:50:51
用户15432638
用户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