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


How do I find an `f` that makes `pcall(pcall, f)` return `false` in Lua?

我正在使用Lua 5.3。

阅读"在Lua第3版中编程"时,我进行了一项练习,要求我找到一个使pcall(pcall, f)返回falsef。 我认为这等效于使pcall(f)引发错误。 但是似乎在任何事情上使用pcall都不会这样做。 例如,让f = nil并没有什么不好的事情发生。

但是,我在互联网上发现让f = (function() end)()可以解决问题。 但是我不明白为什么。 这里f只是函数function() end的返回值(是nil),对吗?


这行不通

1
2
3
> f = (function() end)()
> pcall(pcall, f)
true    false   attempt to call a nil value

但是这样做:

1
2
> pcall(pcall,(function() end)())
false   bad argument #1 to 'pcall' (value expected)

区别在于(function() end)()不返回任何值,这与返回nil不同。
用Lua编写的函数无法进行区分,但是pcall用C编写并且可以进行区分。 (其他示例是printtype。)

请注意,这的行为符合预期(相当于首次尝试):

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


这是因为您正在调用的代码等效于pcall(pcall),而不是pcall(pcall, nil)。 该函数不返回任何内容。 在某些情况下将其调整为nil,但在其他情况下仍与nil不同(在本示例中就是这种情况)。