控制结构是编程语言的重要特性,因为它们使您能够根据程序运行时动态建立的条件来指导程序的流程。不同的语言提供不同的控制结构,在 Lua 中有 while 循环、for 循环和 repeat until 循环。本文介绍了 while 和 repeat until 循环。由于 for 循环的灵活性,我将在另一篇文章中介绍它。
条件由使用运算符的表达式定义,运算符是您可能在数学课上认识的符号的专业术语。Lua 中有效的运算符有
-
==
等于 -
~=
不等于 -
<
小于 -
>
大于 -
⇐
小于或等于 -
>=
大于或等于
这些被称为关系运算符,因为它们会引导您研究两个值之间如何关联。还有逻辑运算符,它们的含义与英语中的含义相同,可以合并到条件中,以进一步描述您要检查的状态
-
and(与)
-
or(或)
以下是一些条件示例
-
foo > 3
:变量foo
是否大于 3?foo
必须为 4 或更大才能满足此条件。 -
foo >= 3
:foo
是否大于或等于 3?foo
必须为 3 或更大才能满足此条件。 -
foo > 3 and bar < 1
:foo
是否大于 3,同时bar
小于 1?要使此条件为真,foo
变量必须为 4 或更大,同时bar
为 0。 -
foo > 3 or bar < 1
:foo
是否大于 3?或者,bar
是否小于 1?如果foo
为 4 或更大,或者bar
为 0,则此条件为真。如果foo
为 4 或更大,而bar
为 0 会发生什么?答案将在本文后面出现。
While 循环
while 循环只要某个条件满足就执行指令。例如,假设您正在开发一个应用程序来监控正在进行的僵尸末日。当没有僵尸剩余时,僵尸末日就结束了
zombie = 1024
while (zombie > 0) do
print(zombie)
zombie = zombie-1
end
if zombie == 0 then
print("No more zombie apocalypse!")
end
运行代码以观看僵尸消失
$ lua ./while.lua
1024
1023
[...]
3
2
1
No more zombie apocalypse!
Until 循环
Lua 也有一个 repeat until 循环结构,它本质上是一个带有“catch”语句的 while 循环。假设您开始园艺,并且想要跟踪还剩下什么可以收获
mytable = { "tomato", "lettuce", "brains" }
bc = 3
repeat
print(mytable[bc])
bc = bc - 1
until( bc == 0 )
运行代码
$ lua ./until.lua
brains
lettuce
tomato
这很有帮助!
无限循环
无限循环具有永远无法满足的条件,因此它会无限运行。这通常是由错误的逻辑或程序中意外状态引起的错误。例如,在本文的开头,我提出了一个逻辑难题。如果将循环设置为在 foo > 3 or bar < 1
之前运行,那么当 foo
为 4 或更大,而 bar
为 0 时会发生什么?
以下是解决此难题的代码,并使用 break
语句作为安全措施,以防万一
foo = 9
bar = 0
while ( foo > 3 or bar < 1 ) do
print(foo)
foo = foo-1
-- safety catch
if foo < -800000 then
break
end
end
您可以安全地运行此代码,但它确实模仿了意外的无限循环。有缺陷的逻辑是 or
运算符,它允许循环在 foo
大于 3 和 bar
小于 1 时继续运行。and
运算符具有不同的效果,但我将其留给您探索。
无限循环实际上确实有其用途。图形应用程序使用技术上是无限循环的东西来保持应用程序窗口打开。无法知道您的用户打算使用该应用程序多长时间,因此程序会无限运行,直到用户选择退出。在这些情况下使用的简单条件是显然始终满足的条件。以下是一个无限循环的示例,同样为了方便起见,内置了安全措施
n = 0
while true do
print(n)
n = n+1
if n > 100 then
break
end
end
条件 while true
始终满足,因为 true
始终为真。这是编写 while 1 == 1
或类似永远为真的简洁方式。
Lua 中的循环
正如您可以从示例代码中看出的那样,尽管有不同的实现,但循环基本上都朝着相同的目标工作。选择对您有意义并且最适合您需要执行的处理的循环。并且以防万一您需要它:终止失控循环的键盘快捷键是 Ctrl+C。
评论已关闭。