自动介绍的 do...end 块对 goto 语句的工作原理是什么?

关于标签范围的 lua doc's comment:

只要不进入局部变量的作用域,goto 就可以跳到任何可见的标签上

因此,我认为以下代码有问题:

-- codelist 1
goto a
local x = 42
::a::

但在 lua web shell 中却可以正常工作。文档继续说道:

注意您可以将以下代码视为等价的

do
  <...>
  --::a::
  goto a  -- 无效 (跳转到局部定义作用域的前向跳转)
  goto b  -- 有效 (跳出块)
  <...>
  local x
  <...>
  ::a::
  <...>
  --goto a
  ::b::
end

do
  <...>
  --::a::
  goto a  -- 无效 (因为嵌套标签不可见)
  goto b  -- 有效 (跳出块)
  <...>
  do
    local x
    <...>
    ::a::
    <...>
    --goto a
  end
  ::b::
end

为什么 ::a:: 包含在自动引入的 do...end 块中,而 ::b:: 不包含?请帮助我理解,谢谢。

编辑: 我还发现了 这篇旧帖子,看起来当时确实禁止了 codelist 1。

点赞
用户2858170
用户2858170
跳转到 a
local x = 42
::a::

不会引发错误。即使在5.2中也不会。

跳转到 a
local x = 42
::a::
print("oh no")

另一方面会引发错误。

Lua的预编译只会在跳转到一个local的作用域并且在标签后仍然在local的作用域内进行操作时才会发出警告。因此,您可以跳转到那里,但是在此无效情况下不能进行其他操作。

与您的第二个示例相同。::b::是该块的结尾。在它之后,在x的作用域内不会发生任何事情,因此跳转到那里是可以的。

跳转到 b
local x = 42
::a::
print("oh no")
::b::

是可以的。

2019-11-21 12:29:21