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




