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

时间:2016-08-24 02:04:11

标签: lua

我使用的是Lua 5.3。

阅读'在Lua第3版编程',我参加了一项练习,要求我找到f使pcall(pcall, f)返回false。我认为这相当于make pcall(f)引发错误。但似乎在任何不会做的事情上使用pcall。例如,让f = nil并没有发生任何不好的事情。

然而,我在互联网上发现让f = (function() end)()成功。但我不明白为什么。此处f只是函数nil的返回值(function() end)对吗?

2 个答案:

答案 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语言编写的,可以区分。 (其他示例包括printtype。)

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

> pcall(pcall,(function() return nil end)())
true    false   attempt to call a nil value

答案 1 :(得分:2)

这是因为您调用的代码等同于pcall(pcall),而不是pcall(pcall, nil)。该功能不会返回任何内容;它在某些情况下调整nil,但在其他情境中仍与nil不同(例如本例中的情况)。