Skip to content

3.3.5 - for语句

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


数字形式的for语句

数字形式的for语句是以一个控制变量遍历算术过程来循环重复一个代码块。其有以下语法:

stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end

给出的标识符(名称)定义了控制变量,其为循环体(语法块)中一个新的局部变量。

循环首先计算一次三个控制表达式的值。这些值分别被称作初始化变量界限以及步长。如果步长被省略了,其默认值为1。

如果初始化变量和步长都是整数,那么循环是由整数结束的;要注意界限可以不是整数。否则,三个值会被转换为浮点数且循环由浮点数结束。这种情况下要注意浮点精度的问题。

在初始化完成后,循环体会通过控制变量的遍历算术过程来重复,其由初始值为始,由给出的步长计算差值。负数的步长会产生一个递减的序列;步长等于零时会抛出异常。循环一直持续到值小于等于(对于正数步长则是大于等于)界限值为止。如果初始值已经小于(或者大于,当步长为正数)界限值时,循环体不会被执行。

对于整数循环,控制变量永远不会回绕;反之,溢出会结束循环。

你不应当在循环期间改变控制变量的值。如果你在循环之后还需要这个值,你可以在退出循环前将其赋值给另一个变量。

通用形式的for语句 {#通用形式的for语句}

通用形式的for语句通过一个被称为迭代器的方法来工作。在每个迭代器中,其迭代方法被调用以产生一个新的值,当这个新值为nil时循环结束。通用形式的**for*循环有以下语法:

stat ::= for namelist in explist do block end
namelist ::= Name {‘,’ Name}

一条for语句就像这样:

for var_1, ···, var_n in explist do body end

var_i被声明为循环体的局部变量。其中的第一个变量就是控制变量

循环首先计算explist以生成四个值:迭代器方法状态、控制结构的初始化变量以及关闭值

然后每次迭代时,Lua会分别将状态和控制变量作为两个参数来调用迭代方法。调用结果在之后被复制到循环变量中,流程遵循多重赋值的规则(参见3.3.3)。控制变量变为nil时,循环终止。否则,将执行循环体并循环到下次迭代。

关闭值的行为和待关闭变量(参见3.3.8)相似,可以用于循环结束时释放资源。否则它不会影响循环。

你不应当在循环期间改变控制变量的值。