该LUA文档的评论对标签范围:
goto可以跳到任何可见的标签,只要它不进入局部变量的范围内
因此,据我了解,以下代码是有问题的:
-- codelist 1
goto a
local x = 42
::a::
Run Code Online (Sandbox Code Playgroud)
但是它在lua web shell中效果很好。该文档继续说:
请注意,您可以想到
Run Code Online (Sandbox Code Playgroud)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相当于
Run Code Online (Sandbox Code Playgroud)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。
goto a
local x = 42
::a::
Run Code Online (Sandbox Code Playgroud)
不会导致错误。甚至在5.2中
goto a
local x = 42
::a::
print("oh no")
Run Code Online (Sandbox Code Playgroud)
另一方面会。
Lua的预编译只会在您跳入本地范围并在仍在本地范围内时在标签之后自动执行某些操作时抱怨。因此,您可能会跳到那里,但是在这种无效情况下您可能不做任何事情。
与您的第二个示例相同。::b::是块的结尾。在此x之后的范围内什么也没有发生,因此可以跳到那里。
goto b
local x = 42
::a::
print("oh no")
::b::
Run Code Online (Sandbox Code Playgroud)
会没事的。