Exception 为什么未在错误消息中指定此未定义的引用?

Exception 为什么未在错误消息中指定此未定义的引用?,exception,lua,Exception,Lua,我有两段相当等效的代码,一段生成一条错误消息,按名称指定错误函数调用,但另一段没有。为什么会这样 (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) Lua中的函数实际上没有名称。相反,当发生错误时,Lua将尝试从代码中派生名称。它适用于简单的静态函数或方法调用(

我有两段相当等效的代码,一段生成一条错误消息,按名称指定错误函数调用,但另一段没有。为什么会这样

(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)

Lua中的函数实际上没有名称。相反,当发生错误时,Lua将尝试从代码中派生名称。它适用于简单的静态函数或方法调用(即99%的所有调用),但当您开始像第一个示例那样将函数视为值时,它就不起作用了。

您认为在第一种情况下,哪种错误消息更好

(f1 or f2)()
> stdin:1: attempt to call a nil value
在此代码中,nil值来自
f1或f2
。错误消息正确地反映了这一点。它没有提到任何名称,因为没有f1或f2的名称

现在,
f1或f2
中的nil来自
f1
f2
。错误消息可能会提到
f2
,但这会让人困惑

如果您编写此命令,您将得到一条更好的错误消息:

f = f1 or f2
f()

因为这太复杂了,Lua无法确定?是的!“Lua中的函数实际上没有名称”