激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Lua - Lua table中安全移除元素的方法

Lua table中安全移除元素的方法

2020-05-04 12:44腳本之家 Lua

這篇文章主要介紹了Lua table中安全移除元素的方法,本文給出3種實現方法,分別是從后往前刪除和while刪除,需要的朋友可以參考下

在Lua中,table如何安全的移除元素這點挺重要,因為如果不小心,會沒有正確的移除,造成內存泄漏。

引子

比如有些朋友常常這么做,大家看有啥問題

將test表中的偶數移除掉

復制代碼 代碼如下:


local test = { 2, 3, 4, 8, 9, 100, 20, 13, 15, 7, 11}
for i, v in ipairs( test ) do
    if v % 2 == 0 then
        table.remove(test, i)
    end
end

 

for i, v in ipairs( test ) do
    print(i .. "====" .. v)
end


打印結果:

復制代碼 代碼如下:

1====3
2====8
3====9
4====20
5====13
6====15
7====7
8====11
[Finished in 0.0s]


有問題吧,20怎么還在?這就是在遍歷中刪除導致的。

 

如何做呢?

Let's get started!

 

復制代碼 代碼如下:


local test = { 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p' }
local remove = { a = true, b = true, c = true, e = true, f = true, p = true }

 

local function dump(table)
    for k, v in pairs( table ) do
        print(k)
        print(v)
        print("*********")
    end
end


說明:一般我們不在循環中刪除,在循環中刪除會造成一些錯誤。這是可以建立一個remove表用來標記將要刪除的,如上面例子,把將要刪除的標記為true

 

方法1 從后往前刪除

復制代碼 代碼如下:


for i = #test, 1, -1 do
    if remove[test[i]] then
        table.remove(test, i)
    end
end

 

dump(test)


為什么不從前往后,朋友們可以測試,table.remove操作后,后面的元素會往前移位,這時候后續的刪除索引對應的元素已經不是之前的索引對應的元素了。

 


方法2 while刪除

復制代碼 代碼如下:

 local i = 1
while i <= #test do
    if remove[test[i]] then
        table.remove(test, i)
    else
        i = i + 1
    end
end

 

方法3 quick中提供的removeItem

復制代碼 代碼如下:


 function table.removeItem(list, item, removeAll)
    local rmCount = 0
    for i = 1, #list do
        if list[i - rmCount] == item then
            table.remove(list, i - rmCount)
            if removeAll then
                rmCount = rmCount + 1
            else
                break
            end
        end
    end
end

 

for k, v in pairs( remove ) do
    table.removeItem(test, k)
end

dump(test)

 

延伸 · 閱讀

精彩推薦
  • LuaLua中計算、執行字符串中Lua代碼的方法

    Lua中計算、執行字符串中Lua代碼的方法

    這篇文章主要介紹了Lua中計算、執行字符串中Lua代碼的方法,類似JavaScript中eval函數的功能,在Lua中也可以實現,需要的朋友可以參考下 ...

    腳本之家6322020-04-30
  • LuaLua和C語言的交互詳解

    Lua和C語言的交互詳解

    這篇文章主要介紹了Lua和C語言的交互詳解,Lua和C語言通過棧完成交互,本文結合代碼實例詳細講解了交互的方法,需要的朋友可以參考下 ...

    果凍想3702020-04-14
  • LuaLua中的元方法__newindex詳解

    Lua中的元方法__newindex詳解

    這篇文章主要介紹了Lua中的元方法__newindex詳解,本文講解了查詢與更新、監控賦值、通過table給另一個table賦值等內容,需要的朋友可以參考下 ...

    笨木頭8872020-04-09
  • LuaLua中table庫函數方法介紹

    Lua中table庫函數方法介紹

    這篇文章主要介紹了Lua中table庫函數方法介紹,本文講解了concat、insert、maxn、remove、sort、foreachi等方法,需要的朋友可以參考下 ...

    腳本之家2502020-04-17
  • LuaLua簡介、編譯安裝教程及變量等語法介紹

    Lua簡介、編譯安裝教程及變量等語法介紹

    這篇文章主要介紹了Lua簡介、編譯安裝教程及變量等語法介紹,本文同時講解了lua注釋語法、Lua命令行方式等內容,需要的朋友可以參考下 ...

    junjie3632020-04-14
  • LuaLua教程(二):基礎知識、類型與值介紹

    Lua教程(二):基礎知識、類型與值介紹

    這篇文章主要介紹了Lua教程(二):基礎知識、類型與值介紹,本文講解了Hello World程序、代碼規范、全局變量、類型與值等內容,需要的朋友可以參考下 ...

    腳本之家5922020-04-28
  • LuaLua實現__add方法重載示例

    Lua實現__add方法重載示例

    這篇文章主要介紹了Lua實現__add方法重載示例,本文直接給出實現代碼,需要的朋友可以參考下 ...

    腳本之家7452020-04-24
  • Lua深入探究Lua中的解析表達式

    深入探究Lua中的解析表達式

    這篇文章主要介紹了深入探究Lua中的解析表達式,對于其語法部分的說明和示例都超詳細,極力推薦此文!需要的朋友可以參考下 ...

    腳本之家3542020-05-05
主站蜘蛛池模板: 久久久久久69 | 中国嫩模一级毛片 | 亚洲一区在线不卡 | 在线小视频国产 | 免费看污视频在线观看 | 久久精品欧美视频 | 久久精品视频首页 | 国产精品久久久久久久久久iiiii | 精品国产乱码久久久久久久 | 精品伊人 | 韩国精品一区二区三区四区五区 | 福利一区二区三区视频在线观看 | 久久亚洲精品国产一区 | chinesehdxxxx无套 久久另类视频 | 69性欧美高清影院 | 精品中文字幕久久久久四十五十骆 | 蜜桃av网 | 亚洲第一成人在线 | 看全色黄大色黄大片女图片 | 亚洲一区 国产精品 | 欧美14一15sex性hd | 中文字幕在线播放第一页 | 欧美日韩中文字幕在线 | 永久av在线免费观看 | 91精品国产综合久久久欧美 | 视频精品久久 | 亚洲第一男人天堂 | 免费啪啪 | 国产亚洲精品久久久久久久久久 | 久久国产精品久久久久久电车 | videos真实高潮xxxx | 久草视频在线看 | 日本在线免费观看视频 | 色精品国产 | 精品黑人一区二区三区国语馆 | 看免费5xxaaa毛片 | 国产一区不卡 | 久久99国产综合精品 | 免费的性爱视频 | 粉嫩粉嫩一区二区三区在线播放 | 久久精品视频在线免费观看 |