Lua中自调用匿名函数存在的问题

我正在尝试在Lua中使用自调用匿名函数,并观察到一些奇怪的行为。

这段代码:

(function ()
  print("自调用函数")
end)()

print("标准调用函数")

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

自调用函数
标准调用函数

但将两者调换顺序:

print("标准调用函数")

(function ()
  print("自调用函数")
end)()

会产生以下错误:

  hammerspoon   lua temp.lua
标准调用函数
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("标准调用函数")

    (function ()
      print("自调用函数")
    end)()
end

foo()

这里发生了什么?

点赞
用户7509065
用户7509065

这是一个解析歧义。无法工作的情况被解析为:

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

换句话说,它打印 standard approach,然后取该 print 的返回值(即 nil),并尝试将其与您的自调用函数作为参数一起调用(在此之后它会尝试调用该结果,但已经崩溃了)。要修复它,在第一个 print 函数调用的末尾添加分号。

2020-05-26 21:35:12