Lua系列--pairs和ipairs
Lua系列–pairs和ipairs
Lua中Table的存儲(chǔ)方式
在看二者的區(qū)別之前,我們首先來(lái)看一下Lua中的table是如何在內(nèi)存中進(jìn)行分配的。 
 Table的組成: 
 1.哈希表 用來(lái)存儲(chǔ)Key-Value 鍵值對(duì),當(dāng)哈希表上有沖突的時(shí)候,會(huì)通過(guò)鏈表的方式組織沖突元素 
 2.數(shù)組 用來(lái)存儲(chǔ) 數(shù)據(jù)(包括數(shù)字,表等) 
 我們來(lái)看一個(gè)簡(jiǎn)單的例子。
輸出結(jié)果
test pairs and ipairs ipairs 2 4 3 pairs 2 4 3 6 5看到輸出結(jié)果是不是感覺(jué)有點(diǎn)莫名其妙,和平時(shí)接觸的遍歷感覺(jué)不太一樣。 
 我們來(lái)看一下這中間Table發(fā)生了怎樣的存儲(chǔ)變化
數(shù)據(jù)在表 t 中的存儲(chǔ)方式: 
 1)根據(jù)元素類別分別存進(jìn)哈希表與數(shù)組: 
 哈希表:{ [1]=1,[3]=3,[5]=5,[6]=6 }; 
 數(shù)組:{ 2,4 } 
 2)將數(shù)組中的元素放入哈希表: 
 當(dāng)數(shù)組中的元素轉(zhuǎn)移到哈希表時(shí),數(shù)組中的元素變?yōu)閇1]=2與[2]=4;而此時(shí)哈希表中已有鍵值對(duì) [1]=1,發(fā)生沖突,會(huì)將新值2重新與鍵1匹配,即得到新的鍵值對(duì)[1]=2,此時(shí)的哈希表元素為: 
 { [1]=2,[2]=4,[3]=3,[5]=5,[6]=6 }
斷點(diǎn)調(diào)試驗(yàn)證, 
 
以上是純數(shù)字的內(nèi)容,我們來(lái)嘗試看一下數(shù)字和表混合的內(nèi)容
local testTab ={1,2,3,4,5}; -- '純表' local testTab1 = {a = 1, b = 2, c =3}; -- '雜表1' local testTab2 = {"zi",a = 5,b = 10, c = 15,"miao","chumo"}; -- '雜表2' local testTab3 = {"zi",a = 5,b = 10, c = 15,"miao",nil,"chumo"};輸出結(jié)果
ipairs testTab 1 2 3 4 5 pairs testTab 1 2 3 4 5 -------------------------- ipairs testTab1 pairs testTab1 1 3 2 -------------------------- ipairs testTab2 zi miao chumo pairs testTab2 zi miao chumo 5 15 10 -------------------------- ipairs testTab3 zi miao pairs testTab3 zi miao chumo 5 15 10 --------------------------Lua中的table最終在內(nèi)存中分配都是鍵值對(duì)的形式 
 
還是按照先哈希(鍵值對(duì)),后數(shù)組(值)的方式進(jìn)行分配, 
 table在存儲(chǔ)值的時(shí)候是按照順序的,但是在存儲(chǔ)鍵值對(duì)的時(shí)候是按照鍵的哈希值存儲(chǔ)的, 
 并不會(huì)按照鍵的字母順序或是數(shù)字順序存儲(chǔ)。 
 請(qǐng)注意最后一個(gè)table,即使元素為空nil的時(shí)候,也會(huì)分配一個(gè)key給它 
 想測(cè)試的可以自己進(jìn)行一下測(cè)試。
pairs和ipairs
二者遍歷的區(qū)別,
ipairs( i開(kāi)頭的巧記 int類型的數(shù)值開(kāi)頭只是為了助記 不是實(shí)際含義) 
 遍歷的索引的特點(diǎn) 
 1.必須是從1開(kāi)頭的 int類型的連續(xù)整數(shù) 1 2 3 4 5 6 7 8 9 ………………….. 
 2.索引不能斷開(kāi),斷開(kāi)則終止遍歷(當(dāng)存在nil 類型的數(shù)據(jù)) 
 終止時(shí)機(jī) 
 1.索引斷開(kāi) 
 2.下一個(gè)索引不存在
pairs 
 遍歷的索引的特點(diǎn) 
 1.遍歷的順序是隨機(jī)的,但是一定會(huì)遍歷整個(gè)表 
 2.pairs是先按照索引值打印(數(shù)字型key,可以用[ ]訪問(wèn)),然后打印哈希(鍵值對(duì)) 
 終止時(shí)機(jī) 
 1.所有元素遍歷完畢
文章參考
https://blog.csdn.net/qq_25561675/article/details/76586891 
 https://www.azimiao.com/2738.html
總結(jié)
以上是生活随笔為你收集整理的Lua系列--pairs和ipairs的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 使用for循环加if-else实现两个数
- 下一篇: Debian Squeez 安装 Gno
