第一版是为 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。保留所有权利。 |