Lua中ipairs和pairs的區別詳解
阿新 • • 發佈:2020-11-17
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