为什么Lua禁止转到本地var定义?

Ste*_*eve 6 lua

我从手册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
Run Code Online (Sandbox Code Playgroud)

这将失败,"......跳进本地x的范围"

但为什么?如果在使用本地x之后执行跳转 - 它不再被触及 - 因此这里不再需要"本地x"

当我用x = 1(全局制作)切换局部x时,它工作正常.

这是一种缺失的疏忽或优化吗?例如,他们可能总是假设跳转到标签后可以使用局部变量

Lil*_*ard 9

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

你是对的,理论上,如果本地从未在标签之后使用,那么它不一定要防止跳跃,但实际上,lua本地存在直到其范围结束,而不是在最后一个之后死亡用法.任何类型的动态代码执行都需要这样.

但是,您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • @Steve:"*我为lua 5.3聚会,这可以优化*"我会反对这样的事情.Lua要求在范围内的任何时候都可以访问本地.范围在块的末尾结束.所以你所拥有的是一段时间,代码可能合法一段时间,然后有人试图在标签之后访问本地.这突然使代码无效.这不是一件好事. (4认同)
  • @Steve:这会导致不可预测的行为.在标签*之后添加一行代码不应*突然使现有的goto非法. (4认同)