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

我正在使用 Lua 5.3。

在阅读《Lua程序设计(第3版)》时,我遇到了一道练习,要求我找到一个使pcall(pcall,f)返回falsef。我认为这等同于使pcall(f)引发错误。但似乎在任何东西上使用pcall都行不通。例如,让f=nil,什么都不会发生。

然而,我在网上找到了一个让f=(function() end)()的技巧,它能够完成任务。但我不明白为什么。这里的f仅仅是函数function() end的返回值(即nil)对吗?

点赞
用户1442917
用户1442917

这是因为你调用的代码相当于pcall(pcall),而不是pcall(pcall, nil)。这个函数不返回任何东西; 在某些情况下,它会被调整为nil,但在其他情况下仍然与nil不同(就像这个例子一样)。

2016-08-24 02:24:17
用户107090
用户107090

这个不行:

> 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
2016-08-24 02:25:06