For 语句

for 语句有两种形式:数字形式和通用形式。

数字 for 循环在控制变量通过算术级数时重复执行一个代码块。语法如下所示:

statement ::= for name `=´ exp `,´ exp [`,´ exp] do block end

for i=1,1000 do
    t[i] = t[i] + 1 
end

block 从第一个 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

请注意下列事项:

  • 全部三个控制表达式都仅在循环开始之前求值一次。它们必须都生成数字。
  • varlimitstep 是不可视变量。此处显示名称只是为了加以说明。
  • 如果第三个表达式(步长)不存在,那么使用的步长为 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 仅进行一次求值。其结果是第一个迭代器变量迭代器函数、状态和初始值。
  • fsvar 是不可视变量。此处显示名称只是为了加以说明。
  • 可以使用 break 退出 for 循环。
  • 循环变量 var_i 是循环的局部变量;在 for 结束后,就无法使用这些变量的值。如果需要这些值,请在中断或退出循环前将这些值赋予其他变量。