For 语句
for 语句有两种形式:数字形式和通用形式。
数字 for 循环在控制变量通过算术级数时重复执行一个代码块。语法如下所示:
statement ::= for name `=´ exp `,´ exp [`,´ exp] do block end
for i=1,1000 do
t[i] = t[i] + 1
endblock 从第一个 exp 的值开始针对 name 重复执行,直至超过第二个 exp 为止,步长为第三个 exp。更准确地说,类似于以下的 for 语句:
for v = e1, e2, e3 do block end等同于以下代码:
do
local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
if not (var and limit and step) then error() end
while (step > 0 and var <= limit) or (step <= 0 and var >= limit) do
local v = var
block
var = var + step
end
end请注意下列事项:
- 全部三个控制表达式都仅在循环开始之前求值一次。它们必须都生成数字。
var、limit和step是不可视变量。此处显示名称只是为了加以说明。- 如果第三个表达式(步长)不存在,那么使用的步长为 1。
可以使用 break 退出 for 循环。
循环变量 v 是循环的局部变量;在 for 结束或中断后,就无法使用此变量的值。如果需要这个值,请在中断或退出循环前将其赋予其他变量。
通用 for 语句作用于称为迭代器的函数。在每个迭代中,将会调用迭代器函数以生成新值,并在新值为 null 时停止。通用 for 循环的语法如下所示:
stat ::= for namelist in explist do block end
namelist ::= Name {`,´ Name}pairs 函数是迭代器函数中的构件,它返回 Lua 表中所有的键/值对。
for key,value in pairs(t) do
block
end 类似于以下的 for 语句:
for var_1, ..., var_n in explist do block end等同于以下代码:
do
local f, s, var = explist
while true do
local var_1, ..., var_n = f(s, var)
var = var_1
if var == null then break end
block
end
end请注意下列事项:
explist仅进行一次求值。其结果是第一个迭代器变量的迭代器函数、状态和初始值。f、s和var是不可视变量。此处显示名称只是为了加以说明。- 可以使用 break 退出 for 循环。
- 循环变量
var_i是循环的局部变量;在 for 结束后,就无法使用这些变量的值。如果需要这些值,请在中断或退出循环前将这些值赋予其他变量。