第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買這本書,您也同時 贊助了 Lua 專案。
![]() |
程式設計 in Lua | ![]() |
第三部分。標準函式庫 第 19 章。資料表函式庫 |
陣列上的另一個有用函式是 table.sort
,我們之前已經看過了。它接收要排序的陣列,以及一個可選的排序函式。這個排序函式接收兩個參數,如果第一個參數在排序後的陣列中應排在前面,則必須傳回 true。如果未提供此函式,sort
會使用預設的 less-than 運算(對應於 `<
´ 運算子)。
一個常見的錯誤是嘗試對資料表的索引進行排序。在資料表中,索引形成一個集合,並且完全沒有順序。如果您想對它們進行排序,您必須將它們複製到陣列中,然後再對陣列進行排序。讓我們看一個例子。假設您讀取了一個原始檔,並建立了一個資料表,針對每個函式名稱,提供定義該函式的行號;如下所示
lines = { luaH_set = 10, luaH_get = 24, luaH_present = 48, }現在,您想要按字母順序列印這些函式名稱。如果您使用
pairs
遍歷此資料表,名稱將按任意順序出現。但是,您無法直接對它們進行排序,因為這些名稱是資料表的鍵。但是,當您將這些名稱放入陣列中時,就可以對它們進行排序。首先,您必須建立一個包含這些名稱的陣列,然後對其進行排序,最後列印結果
a = {} for n in pairs(lines) do table.insert(a, n) end table.sort(a) for i,n in ipairs(a) do print(n) end
請注意,對於 Lua,陣列也沒有順序。但我們知道如何計算,因此只要我們使用已排序的索引存取陣列,我們就可以取得已排序的值。這就是為什麼您應該始終使用 ipairs
而不是 pairs
來遍歷陣列。前者強制使用鍵順序 1、2、...,而後者使用資料表的自然任意順序。
作為一個更進階的解決方案,我們可以撰寫一個迭代器,按照其鍵的順序遍歷資料表。可選參數 f
允許指定替代順序。它首先將鍵排序成一個陣列,然後在陣列上進行迭代。在每一步中,它傳回原始資料表中的鍵和值
function pairsByKeys (t, f) local a = {} for n in pairs(t) do table.insert(a, n) end table.sort(a, f) local i = 0 -- iterator variable local iter = function () -- iterator function i = i + 1 if a[i] == nil then return nil else return a[i], t[a[i]] end end return iter end有了這個函式,就可以輕鬆地按字母順序列印這些函式名稱。迴圈
for name, line in pairsByKeys(lines) do print(name, line) end將列印
luaH_get 24 luaH_present 48 luaH_set 10
版權所有 © 2003–2004 Roberto Ierusalimschy。保留所有權利。 | ![]() |