第一版是针对 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目。
用 Lua 编程 | ||
第三部分。标准库 第 19 章。表库 |
数组上的另一个有用函数是 `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
版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 |