You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Lua中条件变量变更时如何立即中断while循环

为啥你的while循环没法立刻中断?

嘿,我懂你为啥困惑——你以为把a改成false就能马上停掉循环,但结果它还是把当前迭代剩下的代码跑完了,对吧?这其实是while循环的工作机制决定的:它只会在每次迭代的开头检查条件,而不是在循环执行过程中实时监控变量变化

先看你的代码示例:

a = true
while( a == true ) do
    center_general_medium:highlight(1)
    center_general_small:highlight(1)
    center_general_tiny:highlight(1)
    a = false << ------------------- 你以为这里改了就会立刻停
    center_general_medium:highlight(1)
    center_general_small:highlight(1)
    center_general_tiny:highlight(1)
end

当程序进入这个while循环时,先检查a == true,满足条件就开始执行循环体里的代码。哪怕你在循环中间把a设为false,当前这一轮的代码还是会从头走到尾,直到下一次要进入循环前,才会重新判断条件,发现a是false才会退出。

最简单的解决办法:用break直接跳出去

如果你想在设置a = false的瞬间就终止循环,直接加个break语句就行!break是专门用来立刻终止当前循环的关键字,执行到它的时候,程序会直接跳出循环,后面的代码都不会再跑了。修改后的代码长这样:

a = true
while( a == true ) do
    center_general_medium:highlight(1)
    center_general_small:highlight(1)
    center_general_tiny:highlight(1)
    a = false
    break << ------------------- 加这一行,立刻中断循环
    center_general_medium:highlight(1)
    center_general_small:highlight(1)
    center_general_tiny:highlight(1)
end

这样一来,执行到break的时候,循环直接结束,后面那三个highlight调用就不会被执行了,完全符合你的预期。

额外情况:如果a可能被其他代码修改?

要是你的场景里,a不只是在这个循环里被修改,还有其他地方可能会改它,需要在循环执行过程中随时检查要不要退出,那可以在循环的关键节点加条件判断,配合break

a = true
while( a == true ) do
    center_general_medium:highlight(1)
    if not a then break end -- 做完第一个操作就检查一次
    center_general_small:highlight(1)
    if not a then break end -- 做完第二个再检查
    center_general_tiny:highlight(1)
    a = false
    if not a then break end -- 改完a立刻检查
    center_general_medium:highlight(1)
    if not a then break end
    center_general_small:highlight(1)
    if not a then break end
    center_general_tiny:highlight(1)
end

不过这种写法有点繁琐,如果是这种复杂场景,或许可以把检查逻辑封装成一个小函数,让代码更整洁。


内容的提问来源于stack exchange,提问作者André Luís

火山引擎 最新活动