我试图在Lua中使用自调用匿名函数,并且看到一些奇怪的行为。
此:
(function ()
print("self-invoking approach")
end)()
print("standard approach")
工作正常,并输出以下输出:
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中运行时,仅当函数形式为第二形式时才会发生故障,并且两个调用都包装在一个外部函数中,该外部函数称为:
function foo()
print("standard approach")
(function ()
print("self-invoking approach")
end)()
end
foo()
这里发生了什么?
这是一个解析歧义。无效案例被解析为:
print("standard approach")(function ()
print("self-invoking approach")
end)()
换句话说,它正在打印standard approach
,然后获取该print
的返回值(即nil
),并尝试使用自调用函数作为参数来调用它(此后它将具有如果尚未崩溃,也尝试调用该结果)。要解决此问题,请在第一个print
函数调用的末尾添加分号。