Lua 循环:如何使用 while 和 repeat until
创始人
2024-03-02 14:34:49
0

学习如何以及何时在 Lua 中使用 while 和 repeat until 循环。

控制结构是编程语言的一个重要特征,因为它们使你能够根据通常在程序运行时动态建立的条件来指导程序的流程。不同的语言提供了不同的控制,在 Lua 中,有 while 循环、for 循环和 repeat until 循环。这篇文章涵盖了 whilerepeat until 循环。由于它们的灵活性,我在一篇 单独的文章 中介绍 for 循环。

条件是由一个使用运算符的表达式来定义的,运算符是你在数学课上可能认识的符号的一个花哨的术语。Lua 中有效的运算符有:

  • == 等于
  • ~=不等于
  • < 小于
  • > 大于
  • 小于或等于
  • >= 大于或等于

这些被称为关系运算符,因为它们比较两个值之间的关联。还有一些逻辑运算符,其含义与英语中的含义相同,可以纳入条件中,进一步描述你想检查的状态:

  • and
  • or

下面是一些条件的例子:

  • foo > 3:变量 foo 是否大于 3?foo 必须是 4 或更大才能满足这个条件。
  • foo >= 3foo 是否大于或等于 3?foo 必须是 3 或更大才能满足这个条件。
  • foo > 3 and bar < 1foo 是否大于 3 而 bar 小于 1?要满足这个条件,foo 变量必须在 bar 为 0 的同时为 4 或更大。
  • foo> 3 or bar < 1foo 是否大于 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


via: https://opensource.com/article/23/2/lua-loops-while-repeat-until

作者:Seth Kenlon 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

远景发布12.5 MWh ...
4月1日,界面新闻获悉,远景发布全球首款12.5 MWh AI储能...
2026-04-01 15:15:53
LuatOS出发点,让业余...
2026-01-20 22:22:27
《科创板日报》评选2025...
来源:科创板日报 今年的十大科技热词,和人工智能相关的占据一半以上...
2025-12-26 17:46:57
英伟达最新财报再度背书AI...
在AI泡沫论日趋盛行的背景下,全球算力龙头英伟达11月20日发布的...
2025-11-20 22:46:10
2025年全国主流媒体看常...
废旧动力电池被称为巨大的“城市矿山”。近年来,我国新能源汽车产业快...
2025-09-13 20:45:09

热门资讯

“Linux 中国” 开源社区... 这是一个艰难的决定 —— 这不是调侃,而是当你真正做出改变了你十几年生活轨迹的决定时,你就会明白这个...
硬核观察 #1263 德国铁路... #1 德国铁路公司招聘 Windows for Workgroups 3.11 管理员该职位要求了解...
人工智能教程(七):Sciki... 在本系列的 上一篇文章 中,我们用 TensorFlow 构建了第一个神经网络,然后还通过 Kera...
关闭 WSL 中正在运行的 L... 以下是使用 WSL 关闭在 Windows 内运行的 Linux 系统的不同方法。你使用 WSL 在...
MX Linux 23.2 “... 最新的 MX Linux 23.2 小版本更新带来了基本的改进和新增功能。MX Linux 推出了 ...
硬核观察 #1262 网络上最... #1 网络上最古老的软件存档库之一即将关闭美国新墨西哥州立大学(NMSU)最近宣布,即将于 2024...
如何在 RHEL 上通过绑定配... 在 Linux 中,你可以根据自己的需要创建高级网络设置,如 网络绑定 Network Bondin...
Linux Matrix 消息... Matrix 用户可以升级 Fractal 6 了!Fractal 是目前 最好的 Matrix 客...
如何通过 VLC 使用字幕 使用 VLC 媒体播放器播放和管理字幕的新手指南。我是一个超级动漫迷,如果你想观看最新的剧集,那么你...
硬核观察 #1261 X 计划... #1 X 计划在奥斯汀建立内容审核总部据报道,该部门将招聘 100 名全职员工,将主要关注 CSE ...