How do I find an `f` that makes `pcall(pcall, f)` return `false` in Lua?
我正在使用Lua 5.3。
阅读"在Lua第3版中编程"时,我进行了一项练习,要求我找到一个使pcall(pcall, f)返回false的f。 我认为这等效于使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编写并且可以进行区分。 (其他示例是print和type。)
请注意,这的行为符合预期(相当于首次尝试):
1 2
| > pcall(pcall,(function() return nil end)())
true false attempt to call a nil value |
-
谢谢。 因此,它不值得注意吗?
-
"用Lua编写的函数无法区分":这是select(#,...)可以提供的,不是吗:(function(...) print(select(#, ...)) end)((function() end)())?
-
@PaulKulchenko,是的,但是您需要诸如select之类的库函数的帮助。
这是因为您正在调用的代码等效于pcall(pcall),而不是pcall(pcall, nil)。 该函数不返回任何内容。 在某些情况下将其调整为nil,但在其他情况下仍与nil不同(在本示例中就是这种情况)。