如何在Lua中找到使`pcall(pcall,f)`返回`false`的`f`?

Gar*_*mmy 8 lua

我正在使用Lua 5.3.

阅读"Lua第3版编程",我参加了一个练习,要求我找到一个f能够pcall(pcall, f)回归的练习false.我认为这相当于pcall(f)引发错误.但似乎pcall在任何事情上使用都不会那样做.例如,让f = nil并没有什么不好的事情发生.

但是,我在互联网上找到了让它成功f = (function() end)()的方法.但我不明白为什么.这f只是nil函数的返回值(是)function() end吗?

lhf*_*lhf 7

这不起作用

> f = (function() end)()
> pcall(pcall, f)
true    false   attempt to call a nil value
Run Code Online (Sandbox Code Playgroud)

但这样做:

> pcall(pcall,(function() end)())
false   bad argument #1 to 'pcall' (value expected)
Run Code Online (Sandbox Code Playgroud)

区别在于(function() end)()没有返回值,这与返回不同nil.用Lua编写的函数不能区分,但pcall用C语言编写,可以区分.(其他例子是printtype.)

请注意,这符合预期(相当于第一次尝试):

> pcall(pcall,(function() return nil end)())
true    false   attempt to call a nil value
Run Code Online (Sandbox Code Playgroud)