【问题标题】:How do I find an `f` that makes `pcall(pcall, f)` return `false` in Lua?如何在 Lua 中找到一个使 `pcall(pcall, f)` 返回 `false` 的`f`?
【发布时间】:2016-08-24 02:04:11
【问题描述】:

我正在使用 Lua 5.3。

阅读“在 Lua 中编程第 3 版”时,我遇到了一个练习,要求我找到一个 f,它使 pcall(pcall, f) 返回 false。我认为这相当于让pcall(f) 引发错误。但似乎在任何事情上使用pcall 都不会这样做。例如,让f = nil 不会发生任何不好的事情。

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

【问题讨论】:

    标签: lua


    【解决方案1】:

    这不起作用

    > 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
    

    【讨论】:

    • 谢谢。所以这不是值得注意的事情吗?
    • “用 Lua 编写的函数无法区分”:这是select('#',...) 可以提供的东西,不是吗:(function(...) print(select('#', ...)) end)((function() end)())
    • @PaulKulchenko,是的,但是您需要库函数的帮助,例如 select
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多