微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决Lua 表 - 搜索以字母开头的项目

我有这张桌子

private int HandleInstance(Type itemType,//other args) {
    Type managerType = itemType == Type.type1 ? typeof(manager1Type) : 
    typeof(manager2Type);
    Type[] managerTypeArray = { managerType,typeof(int) };
    var myDynamicallyCreatedType = typeof(IMyInterface<,>).MakeGenericType(managerTypeArray);

    //KEY OF THE QUESTION. THIS IS WHAT I AM ASKING FOR
    //assign created variable to dynamic created type to call respective method
    myDynamicallyCreatedType variableName = topManagerInstance.type1Manager; 
    //base type. any type1ManagerType or type2ManagerType to be assigned,as 
    //they inherit from the same IMyInterface<,>,and the type created is 
    //generic
    variableName.ImplementedMethod(//args):
}

在那里我可以通过列出的条目进行搜索

    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
}

并得到结果:

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

现在我想在我的表格中搜索,以单个字母开头,例如“b”,显示所有以字母“b”开头的条目以获得相同的结果?

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

解决方法

首先:表 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}
}
-- Now set a __call metamethod on same table
>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
-- Lets try it once
>animals('b')                                  
1    =    bunny
-- Next one
>animals('c')
3    =    cow
-- Last one
>animals('m')
2    =    mouse

使用元表将你的东西放在一起。
另一个不错的地方是 __index 元方法,它可以保存该表所需的所有函数,并且可以像字符串上的字符串函数一样使用。
(喜欢:value.sname:find(args[1],1)
这导致了 find 应该做的事情的核心。
在第一个示例中,它在整个 sname 中查找匹配模式。
检查 Lua 模式什么也有用。
也许只为开头的 ^ 听起来很聪明?
所以构造查找模式:'^'..args[1]
...如果您的动物中有牛、乌鸦、青蛙和鱼,请使用多个字母。

find 中函数名称为 __index 的示例

>animals = {                                   
     {sname = "bunny",size3 = 324}
}
-- Place a find function into __index
>setmetatable(animals,{__index={find=function(tab,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

如果您想打印所有键值,请扩展 print() 中的 find()

,

停下,我发现了一个问题......

看这里 - 我更喜欢第一个解决方案:

animals = {                                   
     {sname = "bunny",size3 = 324}
}
-- Now set a __call metamethod on same table
setmetatable(animals,...)
local args={...}
for v,k in pairs(tab) do
if k.sname:find(args[1],1) then print(v,k.sname) end
end
end})


-- Search Entries with Start U.....
-- there should be no result,but....
animals('u')

我得到了结果: 1 = 兔子 2 = 鼠标

这不应该是结果!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。