Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Lua禁止通过本地var定义进行goto?_Lua - Fatal编程技术网

为什么Lua禁止通过本地var定义进行goto?

为什么Lua禁止通过本地var定义进行goto?,lua,Lua,我是从手册上读到的 我在循环中有一个类似的代码块: 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之后执行的-它不再被触摸-因此这里不再

我是从手册上读到的

我在循环中有一个类似的代码块:

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时,效果很好


这是遗漏的疏忽还是优化?例如,可能他们总是假设在跳转到标签后可以使用局部变量,我不太确定局部变量是如何注册的,但它们是通过数字索引引用的。假设使用
goto
跳过本地定义,则本地将永远不会被创建,因此任何试图在标签之后访问本地的人都将试图使用无效索引

你是对的,从理论上讲,如果在标签之后从未使用过local,那么它不一定要防止跳转,但在实践中,lua local存在到它的作用域结束,而不是在最后一次使用之后消亡。任何类型的动态代码执行都要求这是真的

但是,可以使用
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

如果在标签所在的位置确实不需要再使用,您可以始终使用
do
-块来限制该局部的范围。您能用代码示例来澄清这一点吗?这是一个巧妙的技巧!谢谢-我收集了lua 5.3的信息,这是可以优化的-我发现的另一个解决方法是,只需在goto标签之前声明我的local,并将其设置为local x=0或其他值,或只是
local x
,这将默认为
nil
。无论如何,Lua5.1在2006年发布,5.2在2011年发布。所以不要屏住呼吸等待Lua 5.3;)@史蒂夫:“我认为Lua5.3可以优化。”我反对这样的事情。Lua要求可以在任何时候访问作用域中的本地文件。范围在块的末尾结束。因此,您遇到的情况是,代码可能在一段时间内是合法的,然后有人尝试在标签之后访问本地。这会使代码突然失效。这不是一件好事。如果while块结束或再次重复,那么在此之后如何访问本地块?不是possible@Steve:这将导致不可预测的行为。在标签后添加一行代码不应突然使现有的goto非法。