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中的函数实际上没有名称”