鍍金池/ 教程/ Java/ 判斷數(shù)組大小
LuaCjsonLibrary
抵制使用 module()函數(shù)來定義 Lua 模塊
點號與冒號操作符的區(qū)別
跨平臺的庫選擇
虛變量
pipeline 壓縮請求數(shù)量
灰度發(fā)布
如何安裝火焰圖生成工具
KeepAlive
正則表達式
稀疏數(shù)組
docker
下標從 1 開始
sleep
使用動態(tài) DNS 來完成 HTTP 請求
如何定位問題
調(diào)試
局部變量
如何對 nginx lua module 添加新 api
動態(tài)限速
變量的共享范圍
請求返回后繼續(xù)執(zhí)行
火焰圖
正確的記錄日志
判斷數(shù)組大小
select+set_keepalive 組合操作引起的數(shù)據(jù)讀寫錯誤
ngx.shared.DICT 非隊列性質(zhì)
API 測試
編碼為 array 還是 object
執(zhí)行階段概念
Json 解析的異常捕獲
性能測試
TIME_WAIT
函數(shù)在調(diào)用代碼前定義
script 壓縮復雜請求
禁止某些終端訪問
什么時候使用
c10 k 編程
阻塞操作
單元測試
持續(xù)集成
緩存失效風暴
調(diào)用其他 C 函數(shù)動態(tài)庫
熱裝載代碼
緩存
Redis 接口的二次封裝(發(fā)布訂閱)
網(wǎng)上有大量對 lua 調(diào)優(yōu)的推薦,我們應該如何看待?
Redis 接口的二次封裝
非空判斷

判斷數(shù)組大小

lua 數(shù)組需要注意的細節(jié)

lua 中,數(shù)組的實現(xiàn)方式其實類似于 C++中的 map ,對于數(shù)組中所有的值,都是以鍵值對的形式來存儲(無論是顯式還是隱式),lua 內(nèi)部實際采用哈希表和數(shù)組分別保存鍵值對、普通值,所以不推薦混合使用這兩種賦值方式。尤其需要注意的一點是: lua 數(shù)組中允許 nil 值的存在,但是數(shù)組默認結(jié)束標志卻是 nil 。這類比于 C 語言中的字符串,字符串中允許'\0'存在,但當讀到'\0'時,就認為字符串已經(jīng)結(jié)束了。

初始化是例外,在 lua 相關(guān)源碼中,初始化數(shù)組時首先判斷數(shù)組的長度,若長度大于 0 ,并且最后一個值不為 nil ,返回包括 nil 的長度;若最后一個值為 nil ,則返回截至第一個非 nil 值的長度。

注意!!一定不要使用#操作符來計算包含 nil 的數(shù)組長度,這是一個未定義的操作,不一定報錯,但不能保證結(jié)果如你所想。如果你要刪除一個數(shù)組中的元素,請使用 remove 函數(shù),而不是用 nil 賦值。

local arr1 = {1, 2, 3, [5]=5}
print(#arr1)               -- output: 3

local arr2 = {1, 2, 3, nil, nil}
print(#arr2)               -- output: 3

local arr3 = {1, nil, 2}
arr3[5] = 5
print(#arr3)               -- output: 1

local arr4 = {1,[3]=2}
arr4[4] = 4
print(#arr4)               -- output: 4

按照我們上面的分析,應該為 1 ,但這里卻是 4 ,所以一定不要使用#操作符來計算包含 nil 的數(shù)組長度。

上一篇:灰度發(fā)布下一篇:c10 k 編程