我是从手册http://lua-users.org/wiki/GotoStatement
中读到的我在循环中有一个类似的代码块:
while true do
if someCond == nil then
goto f -- invalid (forward jump into scope of local definition)
end
local x = 1
-- do something with x
::f::
end
这将失败,“......跳进本地x的范围”
但为什么呢?如果在使用本地x之后执行跳转 - 它不再被触摸 - 因此这里不再需要“本地x”
当我用x = 1(全局制作)切换局部x时,它工作正常。
这是一种缺失的疏忽或优化吗?例如。也许他们总是假设跳转到标签后可以使用本地变量
答案 0 :(得分:9)
我不太确定本地人是如何注册的,但他们是通过数字索引引用的。假设如果使用goto
跳过本地定义,则永远不会创建本地,因此任何试图在标签之后访问本地的人都会尝试使用无效索引。
你是对的,理论上,如果本地从未在标签之后使用,那么它不一定要防止跳跃,但在实践中,lua本地存在直到其范围结束,而不是死亡在最后一次使用之后。任何类型的动态代码执行都需要这样。
但是,您可以使用do
- 块来限制本地人的范围。使用您的代码,您可以将其重写为
while true do
if someCond == nil then
goto f
end
do
local x = 1
-- do something with x
end -- x is now gone
::f::
end