解决方法
语言管理词汇作用域的方式产生了包括goto和continue的问题。例如,
local a=0 repeat if f() then a=1 --change outer a end local a=f() -- inner a until a==0 -- test inner a
在循环体中的局部a的声明屏蔽了名为a的外部变量,并且该局部变量的范围跨越直到语句的条件,因此该条件正在测试最内层a。
如果continue存在,则必须在语义上被限制为仅在条件中使用的所有变量都进入范围之后才有效。这是一个困难的条件,记录到用户和强制在编译器。围绕这个问题的各种建议已经讨论,包括不允许继续重复直到循环风格的简单答案。到目前为止,没有一个有足够的引人注目的用例来将它们包括在语言中。
该工作通常是反转将导致继续执行的条件,并且在该条件下收集循环体的其余部分。所以,下面的循环
-- not valid Lua 5.1 (or 5.2) for k,v in pairs(t) do if isstring(k) then continue end -- do something to t[k] when k is not a string end
可以写
-- valid Lua 5.1 (or 5.2) for k,v in pairs(t) do if not isstring(k) then -- do something to t[k] when k is not a string end end
这是很清楚,通常不是一个负担,除非你有一系列精心设计的控制循环操作的剔除。