Lua 解释器与 break 语句不一致

标签 lua

你好,我正在尝试学习 Lua,我正在研究这门语言,然后我来到了这个代码块

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

    
    print("print 2")
end

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

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

    
    print("Hello World asdasdsad asdasdas")
end

lua 解释器抛出错误 unexpected sign '1'。

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

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

    undefinedFunction("argument 1")
    
    print("print 1")
end

现在 Lua 解释器给出了错误。为什么会出现不一致?

最佳答案

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

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

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

对比第一个片段,其中:

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

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

语法错误:

if true then
  1
end

运行时错误:

if true then
  undefined()
end

没有错误:

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

关于Lua 解释器与 break 语句不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74654240/

相关文章:

arrays - 从 gmatch 返回的列表在 Lua 中创建数组

c++ - lua + 视觉 C++ 2008 : fatal error LNK1107

c++ - 将表传递给 c/c++ 的简单 lua 示例

c - lua 5.2 C api 中的语法更改

lua - 对话框操作不起作用

c++ - 混合从 C 和 C++ 编译的目标文件时出现链接器错误

linux - 在 Lua 中写一个守护进程

sockets - 有没有办法在魔兽世界 Lua 脚本中使用套接字?

lua - 如何让Lua垃圾收集器更频繁地运行?

android - 具有种子作用的随机数生成非确定性