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

问题描述 投票:3回答:1

我试图在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()

这里发生了什么?

function lambda lua interpreter
1个回答
4
投票

这是一个解析歧义。无效案例被解析为:

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

换句话说,它正在打印standard approach,然后获取该print的返回值(即nil),并尝试使用自调用函数作为参数来调用它(此后它将具有如果尚未崩溃,也尝试调用该结果)。要解决此问题,请在第一个print函数调用的末尾添加分号。

© www.soinside.com 2019 - 2024. All rights reserved.