lua中獲取table長度的問題

2021-08-04 13:26:53 字數 2475 閱讀 3374

官方文件是這麼描述#的:

取長度操作符寫作一元操作#。 字串的長度是它的位元組數(就是以乙個字元乙個位元組計算的字串長度)。

tablet的長度被定義成乙個整數下標n。它滿足t[n]不是nilt[n+1]nil; 此外,如果t[1]niln就可能是零。 對於常規的陣列,裡面從 1 到n放著一些非空的值的時候, 它的長度就精確的為n,即最後乙個值的下標。 如果陣列有乙個「空洞」 (就是說,nil值被夾在非空值之間), 那麼#t可能是指向任何乙個是nil值的前乙個位置的下標 (就是說,任何乙個nil值都有可能被當成陣列的結束)。

local tbltest2 =

print(table.getn(tbltest2))

這段**輸出的結果是多少?這裡的輸出結果應該是2。首先,要明白,這個tbltest2不是乙個簡單的table,它混合了列表(list)和記錄(record)兩種風格,表中,a = 2是record風格。其次,要明白,record風格的record是不作為外表的長度計算。你可以把它想象成乙個函式,跟其他物件導向語言一樣,函式是不記為內部變數的。

既然像函式一樣,那就可以輸出a的值,是的。print(tbltest2.a)就可以了。

再看下面的**:

local tbltest3 =

, 3,

}print(table.getn(tbltest3))

這段**輸出的結果是多少?這裡的輸出結果應該是3。要注意,表巢狀表,巢狀表也是元素。所以,輸出的結果是3。

table.getn(t)

等價於 #t。

以下情況相當糾結,可直接看最後一句話總結:

現在來看乙個比較糾結的:

local tbltest4 =

print(table.getn(tbltest4))

這段**輸出的結果是多少?是1。我們都知道table獲取長度的時候,會遍歷一下整個表,在最後乙個非nil處,就會返回。
但是,下面這段**呢?

local tbltest5 =

print(table.getn(tbltest5))

輸出3,好玩吧?它把nil也當成元素計算長度了。但叫你摸不著頭腦的是下面這段**:。
local tbltest5 =

輸出1.再發一段,讓你完全蒙掉:

local tbltest5 =

輸出3.蒙了沒?再看,這一段叫你以後再也不敢再table中寫nil值:

local tbltest5 =

看看吧,這一段的輸出結果是1。親,請問,你以後還敢在lua的table中用nil值嗎???如果你繼續往後面加nil,你可能會發現點什麼。你可能認為你發現的是個規律。但是,你千萬不要認為這是個規律。因為這是錯誤的。

1、在table中不要使用nil

2、如果非要使用nil,必須用table.setn()函式去設定這個table表的長度。注意:新版本的lua已經不支援setn了。

必須給你個結論:

setn函式已過時,不要在lua的table中使用nil值,如果乙個元素要刪除,直接remove,不要用nil去代替

lua5.2中沒有了getn函式,常用的取長度方式為#,

key必須是整形才能用#取

而#的使用又有些需要注意的地方,

首先要明確的是table中有兩部分:陣列部分和hash表部分。而

基本上所有操作都是先陣列後hash表

。先遍歷陣列部分,陣列部分有就結束,沒有再遍歷hash表部分

原始碼中,j++保證j是hash部分的第乙個值,從j開始,如果j位置是有值的,那麼將j擴大兩倍,再檢查兩倍之後hash表中是否可以取到值,直到找到沒有值的地方,這個值就在i 到 j這個區間中。然後再用折半查詢找到 i 到 j之間找到的最後乙個nil的,前面的就是它的長度了。 錯略看來。luah_getint用來取值const tvalue *luah_getint (table *t, int key)而它的宣告看來 ,第二個引數是key,通過key來取value, 而外面對傳入的key是++的操作 可知計算長度用來尋找的這個key一定是個整形,而且還得是連續的(不一定)。(當然這個是不深究細節實現錯略看下來的分析。。。。。)

**:lua中求table長度

lua「#」取長度問題

Lua中table的長度

官方文件是這麼描述 的 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 table t 的長度被定義成乙個整數下標 n 它滿足 t n 不是nil而 t n 1 為nil 此外,如果 t 1 為nil,n 就可能是零。對於常規的陣列,裡面從 1 到 n 放...

lua中求table長度

關於lua table介紹,看以前的文章 官方文件是這麼描述 的 取長度操作符寫作一元操作 字串的長度是它的位元組數 就是以乙個字元乙個位元組計算的字串長度 tablet的長度被定義成乙個整數下標n。它滿足t n 不是nil而t n 1 為nil 此外,如果t 1 為nil,n就可能是零。對於常規的...

lua的table長度問題

看以下 local tbltest1 print table.getn tbltest1 這段 輸出的結果是3,這個大家都知道,是吧。不管最後那個3後面有沒有加逗號,結果都是3。再看下面的 local tbltest2 print table.getn tbltest2 這段 輸出的結果是多少?這裡...