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 ?

希望知道的大佬們,幫我解答解答~~~十分感謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM