2.4.5 - For 语句

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

注意下面这几点:

一般形式的 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

注意以下几点: