我正在使用Lua 5.3.
阅读"Lua第3版编程",我参加了一个练习,要求我找到一个f能够pcall(pcall, f)回归的练习false.我认为这相当于pcall(f)引发错误.但似乎pcall在任何事情上使用都不会那样做.例如,让f = nil并没有什么不好的事情发生.
但是,我在互联网上找到了让它成功f = (function() end)()的方法.但我不明白为什么.这f只是nil函数的返回值(是)function() end吗?
这不起作用
> 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语言编写,可以区分.(其他例子是print和type.)
请注意,这符合预期(相当于第一次尝试):
> pcall(pcall,(function() return nil end)())
true false attempt to call a nil value
Run Code Online (Sandbox Code Playgroud)