第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些差异。
第四版针对 Lua 5.3,可在 Amazon 和其他书店购买。
购买本书,您还可以帮助支持 Lua 项目。
![]() |
用 Lua 编程 | ![]() |
| 第一部分。语言 第 4 章。语句 |
通用 for 循环允许您遍历迭代器函数返回的所有值。我们已经看到通用 for 的示例
-- print all values of array `a'
for i,v in ipairs(a) do print(v) end
对于该代码中的每一步,i 获取一个索引,而 v 获取与该索引关联的值。类似的示例展示了我们如何遍历表的所有键
-- print all keys of table `t'
for k in pairs(t) do print(k) end
尽管通用 for 看起来很简单,但它功能强大。使用适当的迭代器,我们几乎可以遍历任何内容,并以可读的方式进行遍历。标准库提供了多个迭代器,允许我们遍历文件中的行 (io.lines)、表中的对 (pairs)、字符串中的单词 (string.gfind,我们将在 第 20 章 中看到),等等。当然,我们可以编写自己的迭代器。虽然使用通用 for 很容易,但编写迭代器函数的任务有其微妙之处。我们将在 第 7 章 中介绍此主题。
通用循环与数字循环有两个共同的属性:循环变量是循环体中的局部变量,您永远不应该为循环变量分配任何值。
让我们看一个更具体的通用 for 使用示例。假设您有一个表,其中包含一周中的日期名称
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
现在,您想将名称转换为其在周中的位置。您可以搜索该表,查找给定的名称。然而,在 Lua 中,通常更有效的方法是构建一个反向表,例如 revDays,其中名称作为索引,数字作为值。该表将如下所示
revDays = {["Sunday"] = 1, ["Monday"] = 2,
["Tuesday"] = 3, ["Wednesday"] = 4,
["Thursday"] = 5, ["Friday"] = 6,
["Saturday"] = 7}
然后,您只需索引此反向表即可找到名称的顺序
x = "Tuesday"
print(revDays[x]) --> 3
当然,我们不需要手动声明反向表。我们可以自动从原始表中构建它
revDays = {}
for i,v in ipairs(days) do
revDays[v] = i
end
该循环将对 days 的每个元素执行赋值,其中变量 i 获取索引(1、2、...),v 获取值("Sunday"、"Monday"、...)。
| 版权所有 © 2003–2004 Roberto Ierusalimschy。保留所有权利。 | ![]() |