Lua中ipairs和pairs的區別詳解


迭代器for遍歷table時,ipairs和pairs的區別:

區別一:ipairs遇到nil會停止,pairs會輸出nil值然后繼續下去

區別二:

local a = {"Hello", "World", a = 1, b = 2, x = 10, y = 20, "Good", nil, "Bye"}
-- for i,v in ipairs(a) do
--     print(v)
-- end
for k,v in pairs(a) do
    print(k,v)
end

可見:ipairs並不會輸出table中存儲的鍵值對,會跳過鍵值對,然后順序輸出table中的值,遇到nil則會停止。

而pairs會輸出table中的鍵和鍵值對,先順序輸出值,再亂序(鍵的哈希值)輸出鍵值對。

這是因為,table在存儲值的時候是按照順序的,但是在存儲鍵值對的時候是按照鍵的哈希值存儲的,並不會按照鍵的字母順序或是數字順序存儲。

=》對於a來說,如果執行print(a[3]),輸出的結果也會是Good。也就是說table並不會給鍵值對一個索引值。

也就是說,ipairs知識按照索引值順序,打印出了table中有索引的數據,沒有索引值的不管。

而pairs是先按照索引值打印,打印完成后再按照鍵值對的鍵的哈希值打印它的值。


 

所以,怎么順序輸出一個table里面的鍵值對?

local tab = {
    key1 = 1,
    key2 = 2,
    key3 = 3,
    key4 = 4,
    key5 = 5,
    key6 = 6,
    key7 = 7,
}

function getLen(tab)
    local len = 0
    for _,v in pairs(tab) do
        len = len + 1
    end
    return len
end

local key
for i=1,getLen(tab) do
    key = "key"..i
    print(key, tab[key])
end

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM