第一版是針對 Lua 5.0 編寫的。雖然在很大程度上仍然適用於後續版本,但仍有一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買這本書,您也同時 贊助了 Lua 專案


19.3 – 排序

陣列上的另一個有用函式是 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