zoukankan      html  css  js  c++  java
  • lua之table.remove你不知道的坑

    推荐阅读:

    前言

    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 ?
    
    

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

  • 相关阅读:
    《python编程从入门到实践》变量和简单数据类型
    《初学python》
    centos7 关闭防火墙
    记几个学习资源
    servlet-api.jar
    spring 对Map的一种扩展 MultiValueMap
    CPU飚高问题解决
    聊聊数据库优化
    netty的核心组件
    【转】 一个著名的日志系统是怎么设计出来的?
  • 原文地址:https://www.cnblogs.com/shirln/p/13389620.html
Copyright © 2011-2022 走看看