Function Lua中自调用匿名函数时出错
我试图在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
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)()