Lua中pair和ipair的區別

畅知發表於2024-03-08

Lua中pair和ipair的區別?

二者都是Lua中內建的迭代器,可以對陣列或table進行遍歷。

在正常的陣列或table的遍歷中,二者沒有區別。

tableNormal={"this","is","a","array"}
--使用 pairs 遍歷
for key,val in pairs(tableNormal) do
    print(key,'==',val)
end

遍歷結果:

image-20240308194558419

--使用 ipairs遍歷
for key,val in ipairs(tableNormal) do
    print(key,'==',val)
end

遍歷結果:

image-20240308194625680

二者沒有任何差別!

之所以說是正常的陣列,是因為索引是連續的,數值都是存在的,不存在nil的情況。

而如果索引不連續,或索引型別不是num,那麼二者就顯現出差別。再看,

  1. 索引型別為num,但不連續
table1={}
table1[1]="Hello"
table1[2]="Tony!"
table1[3]="This"
table1[6]="is"
--使用ipairs 遍歷
for key,val in ipairs(table1) do
    print(key,'==',val)
end

結果:

image-20240308200218112

--使用pairs遍歷
for key,val in pairs(table1) do
    print(key,'==',val)
end

結果:

image-20240308200300457

顯然,使用pairs能對陣列內容整體遍歷。而ipairs只會訪問連續的數字索引內容。

檢視一下table長度(實際長度為4):

print("table1的長度",#table1)

image-20240308203310667

好,我們再看一個情況:

table2={[2]="welcome",[3]="to",[4]="my",[5]="blog"}
print("----------------ipairs-------------------------")
for key,val in ipairs(table2) do
    print(key,"==",val)
end

猜猜會列印什麼?

什麼也沒有列印!可見ipairs只能從索引為1的位置遍歷,且只能訪問連續的索引區間。

image-20240308201107204

當然,pairs可以直接遍歷咯!

for key,val in pairs(table2) do
    print(key,"==",val)
end

image-20240308201355047

--檢視陣列長度
print("table2長度====",#table2)

image-20240308202315426

可見長度的獲取和ipairs有關。

我們可以自定義獲取陣列長度的函式

function tableSize(table)
    local size=0
    for k,v in pairs(table) do
        size=size+1
    end
    return size
end

print("table2長度====",tableSize(table2))

image-20240308202717573

  1. 對於索引型別為非nums的table來說,若想遍歷直接使用pairs即可。

    tableAbnormal={[1]="TonyCode",index1="index1",i2="index2",s3="s3"}
    print("=============ipairs的執行結果=============")
    for i, v in ipairs(tableAbnormal) do
        print(i, '=', v)
    end
    print("=============pairs的執行結果=============")
    for i, v in pairs(tableAbnormal) do
        print(i, '=', v)
    end
    

    image-20240308201916520

    image-20240308201852055

    綜上可知,ipairs適用於數值索引且連續的陣列或table的遍歷,而pairs對於不同元素型別的陣列都適用。但是能使用ipairs儘可能使用,其效能更好。

    參考文章:https://zhuanlan.zhihu.com/p/85890198

相關文章