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

Kei*_*ett 3 lambda lua interpreter function

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

这个:

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

print("standard approach")
Run Code Online (Sandbox Code Playgroud)

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

self-invoking approach
standard approach
Run Code Online (Sandbox Code Playgroud)

但颠倒两者:

print("standard approach")

(function ()
  print("self-invoking approach")
end)()
Run Code Online (Sandbox Code Playgroud)

导致此错误:

?  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 ?
Run Code Online (Sandbox Code Playgroud)

奇怪的是,当代码在 Lua REPL 中运行时,只有在函数形式为 second 时才会发生失败,并且两个调用都包装在一个被调用的外部函数中:

function foo()
    print("standard approach")

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

foo()
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?

Jos*_*ica 5

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

print("standard approach")(function ()
  print("self-invoking approach")
end)()
Run Code Online (Sandbox Code Playgroud)

换句话说,它正在打印standard approach,然后获取它的返回值print(即nil),并尝试使用您的自调用函数作为参数来调用它(之后它也会尝试调用它的结果,有它还没有崩溃)。要修复它,请在第一个print函数调用的末尾添加一个分号。

  • 在 javascript 中尝试一下: `console.log("test") ( () => console.log("foo"))()` 同样的问题,同样的解决方案(添加一个 `;`)。发生这种情况是因为在许多编程语言中括号用于不止一件事,这可能会导致这些歧义。 (2认同)