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


4.3.5 – 通用 for

通用 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"、...)。