首页 > 解决方案 > do...end 块的自动引入如何用于 goto 语句?

问题描述

lua doc对标签范围的评论:

goto 可以跳转到任何可见标签,只要它不进入局部变量的范围

所以在我的理解中,下面的代码是有问题的:

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

但它在lua web shell中运行良好。医生继续说:

注意你可以想到

do
  <...>
  --::a::
  goto a  -- invalid (forward jump into scope of local definition)
  goto b  -- valid (jump out of block)
  <...>
  local x
  <...>
  ::a::
  <...>
  --goto a
  ::b::
end

相当于

do
  <...>
  --::a::
  goto a  -- invalid (jump into nested block prohibited because nested label not even visible here)
  goto b  -- valid (jump out of block)
  <...>
  do
    local x
    <...>
    ::a::
    <...>
    --goto a
  end
  ::b::
end

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

编辑:我也发现了这个旧帖子,似乎确实有一段时间禁止编码表1。

标签: lua

解决方案


goto a
local x = 42
::a::

不会导致错误。甚至在 5.2 中也没有

goto a
local x = 42
::a::
print("oh no")

另一方面会。

Lua 的预编译只会在您跳入本地范围并在标签之后执行某些操作但仍在本地范围内时才会抱怨。所以你可能会跳到那里,但在这种无效的情况下你可能不会做某事。

与您的第二个示例相同。::b::是块的结尾。在它之后的范围内什么都没有发生x,所以可以跳到那里。

goto b
local x = 42
::a::
print("oh no")
::b::

会好的。


推荐阅读