为什么这个未定义的引用没有在错误信息中被指定?

我有两段代码非常类似,一个会生成一个指定错误函数调用的错误信息,但另一个不会。为什么会这样呢?

(f1 or f2)()
> stdin:1: attempt to call a nil value

if f1 then f1() else f2() end
> stdin:1: attempt to call global 'f2' (a nil value)
点赞
用户646619
用户646619

Lua 中的函数实际上没有名称。相反,当发生错误时,Lua 会尝试从代码中推导出名称。这适用于简单的静态函数或方法调用(即 99% 的所有调用),但不适用于当您开始像值一样对待函数时,比如第一个示例。

2014-11-28 02:02:33
用户107090
用户107090

你认为在第一种情况下哪个错误信息更好?

(f1 or f2)()
> stdin:1: attempt to call a nil value

在这段代码中,空值来自于 f1 or f2。错误信息正确地反映了这一点。它没有提到任何名称,因为 f1 or f2 没有名称。

现在,f1 or f2 中的空值来自于 两个 f1f2。错误信息 可以 提到 f2,但这样会让人困惑。

如果你这样写,你会得到更好的错误信息:

f = f1 or f2
f()
2014-11-28 12:18:14