6

我从手册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 时,它工作正常。

这是疏忽还是缺少优化?例如,也许他们总是假设在跳转到标签后可以使用本地变量

4

1 回答 1

11

我不太确定本地人是如何注册的,但它们是通过数字索引引用的。据推测,如果使用 agoto跳过本地定义,则永远不会创建本地,因此任何试图在标签之后访问本地的人都会尝试使用无效索引。

你是对的,理论上,如果 local 在标签之后从未使用过,那么它不一定要阻止跳转,但在实践中,lua local 一直存在到其范围的末尾,而不是在它的最后一个之后死亡用法。任何类型的动态代码执行都要求这是真的。

但是,您可以使用do-block 来限制本地人的范围。使用您的代码,您可以将其重写为

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
于 2013-01-24T23:53:33.970 回答