lua之table.remove你不知道的坑

举报
爱上游戏开发 发表于 2022/07/01 23:49:06 2022/07/01
【摘要】 推荐阅读:  我的CSDN 我的博客园 QQ群:704621321 我的个人博客 前言 table是Lua中唯一的数据结构,其他语言...

推荐阅读:

前言

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:数组,队列,集合等,Lua都是通过table来实现,并且在Lua中table很好的实现了这些数据结构。对于table的常用操作有:

table.insert(tab,vaule)
table.remove(tab,index)
table.sort(tab,func)

table.remove介绍

今天我们只分享一下table.remove操作,为什么呢?因为今天采坑了(欲哭无泪~~~)
上面介绍了table.remove的格式:参数1是操作的table表,参数二是需要移除的字段在table表中的下表。

例1

对于一个table表:key由1开始,不间断,使用table移除存在该key的字段

local tab={[1]=5,[2]=4,[3]=2,[4]=3,[5]=1}
print("移除前table长度值为:",#tab)
for k,v in pairs(tab) do
    if k==3 then
        local value= table.remove(tab,k)
        print("移除的值为:",value)
    end
end
print("移除后table长度值为:",#tab)

输出为:

移除hou的前table长度值为:	5
移除的值为:	2
移除hou的后table长度值为:	4

例2

对于一个table表:key由1开始,间断,使用table移除不存在该key的字段:

local tab={[1]=5,[6]=4,[3]=2,[4]=3,[5]=1}
print("移除前table长度值为:",#tab)
for k,v in pairs(tab) do
    if k==2 then
        local value= table.remove(tab,k)
        print("移除的值为:",value)
    end
end
print("移除后table长度值为:",#tab)

输出为:

移除hou的前table长度值为:	1
移除hou的后table长度值为:	1

原因:#取table的长度时,当key值间断时,只会执行到间断前。至于为什么没有进行移除操作,是因为tab中没有key=2的这个字段。

例3

一个table表:key由1开始,间断,使用table移除不存在该key的字段:

local tab={[1]=5,[6]=4,[3]=2,[4]=3,[5]=1}
print("移除前table长度值为:",#tab)
for k,v in pairs(tab) do
    if k==6 then
        local value= table.remove(tab,k)
        print("移除的值为:",value)
    end
end
print("移除后table长度值为:",#tab)

输出为:

移除前table长度值为:	1

lua: /usercode/file.lua:5: bad argument #1 to 'remove' (position out of bounds)
stack traceback:
	[C]: in function 'remove'
	/usercode/file.lua:5: in main chunk
	[C]: in ?

原因:table长度为1,当要取下标为6的字段时,提示越界。因为在table中,不管你的key是多少,下标永远从1开始,1,2,3…

例4

对于一个table表:key是string类型,使用table指定key时:

local tab={}
tab["csdn"]={nickname="爱上游戏开发",fans="1000",sort="10"}
tab["抖音"]={nickname="shirln",fans="1.3w",sort="1"}
tab["微信公众号"]={nickname="爱上游戏开发",fans="1.3w",sort="1"}
tab["QQ群"]={nickname="游戏开发交流群",fans="1.3w",sort="1",QQGroup=704621321}
for k,v in pairs(tab) do
    print(k,v)
    if k=="csdn" then
        local vaule=table.remove(tab,k)
        print("移除---",vaule)
    end
end

输出为:

抖音	table: 0x8e98c0
微信公众号	table: 0x8e9a20
csdn	table: 0x8ea2f0


lua: /usercode/file.lua:9: bad argument #2 to 'remove' (number expected, got string)
stack traceback:
	[C]: in function 'remove'
	/usercode/file.lua:9: in main chunk
	[C]: in ?

原因:table.remove移除table中的字段时,是根据index,也就下标来移除的,上文中的k,其实只是table每个字段的key。

基于例3,例4,提个问题,求解答

table如下,如果想移除key==3的字段该如何操作?

local tab={[4]="a",[3]="b",[8]="c"}

我的操作:

local tab={[4]="a",[3]="b",[8]="c"}
for k,v in pairs(tab) do
    print(k,v)
    if k==3 then
        local vaule=table.remove(tab,k)
        print("移除---",vaule)
    end
end

运行结果:

4	a
3	b


lua: /usercode/file.lua:5: bad argument #1 to 'remove' (position out of bounds)
stack traceback:
	[C]: in function 'remove'
	/usercode/file.lua:5: in main chunk
	[C]: in ?

希望知道的大佬们,帮我解答解答~~~十分感谢!!!

文章来源: unity3d.blog.csdn.net,作者:爱上游戏开发,版权归原作者所有,如需转载,请联系作者。

原文链接:unity3d.blog.csdn.net/article/details/105569618

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。