lua - 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。
解决方案
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::
会好的。
推荐阅读
- angularjs - AngularJS ui-router 删除 URL 上的哈希
- javascript - Firebase Cloud Function Auth Trigger 未触发
- elasticsearch - logstash 如何将数据路由到新的主 ES 节点,而不是旧的?
- javascript - VueJS hello world 示例未呈现
- android - 如何获取在 Firebase 中手动上传的所有图像
- c# - 尽可能完美的十进制算术
- javascript - font-face 样式组件 - OTS 解析错误:无效的版本标签
- android - 使用互联网的没有服务器的套接字连接
- algorithm - 具有给定范围内元素的最长长度子数组
- python - 如何使用漂亮的汤从存储在列表中的链接中抓取内容?