为何return语句后的标签会引发Lua语法错误?
Lua语法解析细节:为何单独行return后加标签会报错?
这是Lua语法解析的一个特殊规则:当return语句单独占据一行(行尾没有分号或其他语句)时,Lua解析器会将其视为当前代码块的结束标志。
报错代码分析
function f() return 1 ::LABEL:: end print(f())
解析器读到return 1这一行时,会默认函数f的代码块在这里就结束了,后续的::LABEL::被判定为函数外部的代码。但函数的闭合end又出现在标签之后,这就导致解析器抛出错误——它认为函数在return处就该用end闭合,结果却看到了标签。
正常运行代码分析
function f() if true then return 1 end ::LABEL:: end print(f())
这里的return 1嵌套在if代码块中,if块有自己的end来完成闭合,所以解析器不会把这个return当成整个函数块的结束标记。函数块的范围依然覆盖到最后的end,标签::LABEL::属于函数内部的有效语句(只是永远不会被执行到),因此语法完全合法。
总结:单独一行的return会被Lua自动截断当前代码块,而嵌套在子块里的return不会影响外层代码块的范围。
内容的提问来源于stack exchange,提问作者giuliolunati
相关产品推荐
相关产品推荐

