Lua解释器与break语句不一致

asi*_*tot 2 lua

你好,我正在尝试学习 Lua,我正在尝试这种语言,并且遇到了这个代码块

for i = 1, 4, 1
do
    if(i == 2) then
        break
        undefinedFunction("print 1")
    end

    
    print("print 2")
end
Run Code Online (Sandbox Code Playgroud)

这对于解释器来说很好,并且对于未定义的函数没有任何作用。另一方面,如果我们像这样制作这个代码块

for i = 1, 4, 1
do
    if(i == 2) then
        break
        1
    end

    
    print("Hello World asdasdsad asdasdas")
end
Run Code Online (Sandbox Code Playgroud)

lua 解释器抛出错误意外符号“1”。

所以我认为 Lua 解释器会处理未定义的函数并忽略它们,但如果我这样编码

for i = 1, 4, 1
do
    if(i == 2) then
        break
        
    end

    undefinedFunction("argument 1")
    
    print("print 1")
end
Run Code Online (Sandbox Code Playgroud)

现在Lua解释器给出错误。为什么会出现不一致的情况呢?

Luc*_* S. 5

这里的区别是“语法错误”与“运行时错误”。

第二个片段有语法错误:单个文字(例如数字1或字符串"foo")不是有效的语句。在 Lua 开始运行文件之前,文件需要没有语法错误,这就是为什么无论您将1.

第三个片段有一个运行时错误:文件语法完全正确,Lua 可以开始解释它。只有当它到达有问题的行时,虚拟机才会意识到这一点undefinedFunction == nil,并且它不能将其用作函数。

与第一个片段对比,其中:

  • 没有语法错误
  • 出现运行时错误的行“隐藏”在 a 后面break,永远不会到达,因此永远不会触发错误

这里没什么break特别的,一个简单的if可以显示相同的行为:

语法错误:

if true then
  1
end
Run Code Online (Sandbox Code Playgroud)

运行时错误:

if true then
  undefined()
end
Run Code Online (Sandbox Code Playgroud)

没有错误:

if false then
  undefined() -- This line is never reached, and will not cause an error
end
Run Code Online (Sandbox Code Playgroud)