Function Lua中自调用匿名函数时出错

Function Lua中自调用匿名函数时出错,function,lambda,lua,interpreter,Function,Lambda,Lua,Interpreter,我试图在Lua中使用自调用匿名函数,并且看到一些奇怪的行为 这: 正常工作并打印以下输出: self-invoking approach standard approach 但反过来说: print("standard approach") (function () print("self-invoking approach") end)() 导致此错误的原因: ➜ hammerspoon  lua temp.lua standard approach lua: temp.lua

我试图在Lua中使用自调用匿名函数,并且看到一些奇怪的行为

这:

正常工作并打印以下输出:

self-invoking approach
standard approach
但反过来说:

print("standard approach")

(function ()
  print("self-invoking approach")
end)()
导致此错误的原因:

➜  hammerspoon   lua temp.lua
standard approach
lua: temp.lua:1: attempt to call a nil value
stack traceback:
    temp.lua:1: in main chunk
    [C]: in ?
奇怪的是,当代码在Lua REPL中运行时,只有当函数形式为second时才会发生故障,并且两个调用都包装在一个外部函数中,该函数被调用:

function foo()
    print("standard approach")

    (function ()
      print("self-invoking approach")
    end)()
end

foo()

这里发生了什么?

这是一个语法歧义。非工作案例被解析为:

print("standard approach")(function ()
  print("self-invoking approach")
end)()

换句话说,它正在打印
标准方法
,然后获取该
打印
(即
nil
)的返回值,并尝试使用您的自调用函数作为参数调用该函数(如果该函数未崩溃,它也会尝试调用该函数的结果)。要解决此问题,请在第一次
print
函数调用的末尾添加分号。

这不是歧义。解析器使用最长的有效表达式。@lhf不是吗?我认为这是一种歧义,而使用最长的有效表达式就是它选择如何解决歧义。此外,在Lua5.1中,它确实无法解析错误
歧义语法(函数调用x新语句)
。哇!我很惊讶。其他语言也有这种行为吗?我想我以前从未见过它。我决定将“;”直接放在函数定义(
;(函数…
)之前,以确保它永远不会被视为先前语句的一部分。请在javascript中尝试此操作:
console.log(“test”)(()=>console.log(“foo”)()
相同的问题,相同的解决方案(添加
)。之所以会出现这种情况,是因为在许多编程语言中,圆括号用于多个对象,这可能会导致这些歧义。
print("standard approach")(function ()
  print("self-invoking approach")
end)()