lua的for的坑

mc宇少發表於2024-06-14

是的,你完全正確。在 Lua 中,使用 pairs 函式遍歷表(table)時,遍歷的順序並不是按照表在記憶體中的物理順序或者鍵(key)的插入順序來的,而是根據表內部雜湊(hash)機制決定的順序。這個順序對於不同的 Lua 版本、不同的表內容,甚至不同的 Lua 狀態機(state machine)都可能不同。

Lua 表的鍵(key)是透過雜湊函式對映到一個位置上的,這個位置用於儲存與鍵關聯的值(value)。由於雜湊函式和內部實現的原因,pairs 函式遍歷表的順序是不可預測的,並且每次遍歷都可能不同。

如果你需要按照特定的順序遍歷表,你應該使用其他方法,比如:

  1. 數字鍵順序:如果你的表只包含數字鍵,並且這些鍵是連續的,你可以使用一個簡單的迴圈來遍歷它們。
  2. 排序:你可以使用 table.sort 函式對錶的鍵進行排序,然後按照排序後的順序遍歷表。但請注意,table.sort 函式預設只適用於陣列部分(即鍵為連續整數的部分)的排序。如果你的表包含非數字鍵,你需要先提取出所有鍵,對它們進行排序,然後按照排序後的順序遍歷表。
  3. 自定義順序:你可以根據自己的需要定義一個順序,然後按照這個順序遍歷表。這通常涉及到提取出所有鍵,對它們進行排序(如果需要的話),然後按照你定義的順序遍歷這些鍵。

這裡是一個使用 table.sort 對鍵進行排序,然後遍歷表的例子:

local t = {  
    "c" = 3,  
    "a" = 1,  
    "b" = 2,  
}  
  
local keys = {}  
for k in pairs(t) do  
    table.insert(keys, k)  
end  
  
table.sort(keys)  
  
for _, k in ipairs(keys) do  
    print(k, t[k])  
end

相關文章