第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目


19.3 – 排序

数组上的另一个有用函数是 `table.sort`,我们之前已经见过。它接收要排序的数组,以及一个可选的顺序函数。此顺序函数接收两个参数,如果第一个参数在排序数组中应排在前面,则必须返回 true。如果未提供此函数,`sort` 将使用默认的小于操作(对应于 `<´ 运算符)。

一个常见的错误是尝试对表的索引进行排序。在表中,索引形成一个集合,并且没有任何顺序。如果您想对它们进行排序,则必须将它们复制到数组中,然后对数组进行排序。我们来看一个例子。假设您读取一个源文件并构建一个表,该表为每个函数名称提供该函数被定义所在的行;类似于以下内容

    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