for 有两种形式:一种是数字形式,另一种是一般形式。
数字形式的 for 循环,通过一个数学运算不断的运行内部的代码块。 下面是它的语法:
stat ::= for Name `=´ exp `,´ exp [`,´ exp] do block end
block 将把 name 作循环变量。从第一个 exp 开始起,直到第二个 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
都是一些不可见的变量。
这里给它们起的名字都仅仅用于解释方便。
v
是一个循环内部的局部变量;
当 for 循环结束后,你就不能在使用它。
如果你需要这个值,在退出循环前把它赋给另一个变量。
一般形式的 for 通过一个叫作叠代器(iterators)的函数工作。 每次叠代,叠代器函数都会被调用以产生一个新的值, 当这个值为 nil 时,循环停止。 一般形式的 for 循环的语法如下:
stat ::= for namelist in explist1 do block end namelist ::= Name {`,´ Name}
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 == nil then break end block end end
注意以下几点:
explist
只会被计算一次。
它返回三个值, 一个叠代器函数,一个状态,一个叠代器的初始值。
f
、 s
、 以及 var
都是不可见的变量。
这里给它们起的名字都只是为了解说方便。
var_i
对于循环来说是一个局部变量;
你不可以在 for 循环结束后继续使用。
如果你需要保留这些值,那么就在循环结束前赋值到别的变量里去。