返回介绍

2.4.5 - For 语句

发布于 2019-08-25 13:16:34 字数 1904 浏览 1181 评论 0 收藏 0

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

注意下面这几点:

  • 所有三个控制表达式都只被运算一次,表达式的计算在循环开始之前。 这些表达式的结果必须是数字。
  • varlimit 、以及 step 都是一些不可见的变量。 这里给它们起的名字都仅仅用于解释方便。
  • 如果第三个表达式(步长)没有给出,会把步长设为 1 。
  • 你可以用 break 来退出 for 循环。
  • 循环变量 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 只会被计算一次。 它返回三个值, 一个叠代器函数,一个状态,一个叠代器的初始值。
  • fs、 以及 var 都是不可见的变量。 这里给它们起的名字都只是为了解说方便。
  • 你可以使用 break 来跳出 for 循环。
  • 循环变量 var_i 对于循环来说是一个局部变量; 你不可以在 for 循环结束后继续使用。 如果你需要保留这些值,那么就在循环结束前赋值到别的变量里去。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文