我使用的是Lua 5.3。
阅读'在Lua第3版编程',我参加了一项练习,要求我找到f
使pcall(pcall, f)
返回false
。我认为这相当于make pcall(f)
引发错误。但似乎在任何不会做的事情上使用pcall
。例如,让f = nil
并没有发生任何不好的事情。
然而,我在互联网上发现让f = (function() end)()
成功。但我不明白为什么。此处f
只是函数nil
的返回值(function() end
)对吗?
答案 0 :(得分:6)
这不起作用
> f = (function() end)()
> pcall(pcall, f)
true false attempt to call a nil value
但这样做:
> pcall(pcall,(function() end)())
false bad argument #1 to 'pcall' (value expected)
不同之处在于(function() end)()
没有返回任何值,这与返回nil
不同。
用Lua编写的函数不能区分,但pcall
是用C语言编写的,可以区分。 (其他示例包括print
和type
。)
请注意,此操作符合预期(相当于第一次尝试):
> pcall(pcall,(function() return nil end)())
true false attempt to call a nil value
答案 1 :(得分:2)
这是因为您调用的代码等同于pcall(pcall)
,而不是pcall(pcall, nil)
。该功能不会返回任何内容;它在某些情况下调整到nil
,但在其他情境中仍与nil
不同(例如本例中的情况)。