【lua】table是否爲空的判斷
在項目的腳本lua中經常有這樣的需求,
1、local a = {}
2、對a進行處理
3、對a是否爲空表進行判斷
關於對a是否爲空表的判斷,如果直接這樣做:
if a == {} then
這樣的結果就是a == {}永遠返回false,是一個邏輯錯誤。因爲這裏比較的是table a和一個匿名table的內存地址。
也有些代碼如此做:
if table.maxn(a) == 0 then
這樣做也不保險,除非table的key都是數字,而沒有hash部分。
難道真的要遍歷table發現有東西就return false跳出才能斷定它是否爲空嗎?這樣做是可以的,至少目前項目中前人是這麼封裝的,不過代碼太難看.
網上小搜了一下,發現原來官方手冊裏早已經給了答案,那就是靠lua內置的next函數
即如此用:if next(a) == nil then
next其實就是pairs遍歷table時用來取下一個內容的函數.
在項目的module中最好封裝一下,免得module本地也有next函數
於是封裝後判斷的lua table是否爲空的函數如下:
function table_is_empty(t)
return _G.next( t ) == nil
end
不過呢,使用next也有注意事項,一併提一下。for循環pairs一個table就是使用的next實現,不過這個循環過程中,不能賦新的元素給table,不然結果就是未知的,不過你可以在循環的過程中改變已有的值,特別地,可以通過賦爲nil來刪除一個元素。
1 t = { [1] = 'a', [2] = 'b', [3] = 'c', [32] = 'df', [10] = 'm'} 2 START = 5 3 for k, v in pairs(t) do 4 print(k, v) 5 if k < START then 6 t[k + START] = v 7 t[k] = nil 8 end 9 end1011 print('****************') 12 for k, v in pairs(t) do13 print(k, v) 14 end
執行結果
next的文檔說明如下: