我有两个相当等效的代码,一个生成一个错误消息,它按名称指定错误的函数调用,但另一个不生成。这是为什么?
(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)
答案 0 :(得分:3)
Lua中的函数实际上没有名称。相反,当发生错误时,Lua将尝试从代码中派生名称。它适用于简单的静态函数或方法调用(即所有调用的99%),但是当您开始将函数更像值时,就像在第一个示例中那样。
答案 1 :(得分:1)
您认为在第一种情况下哪种错误消息会更好?
(f1 or f2)()
> stdin:1: attempt to call a nil value
在此代码中,nil值来自f1 or f2
。错误消息正确反映了这一点。它没有提到任何名称,因为f1 or f2
没有名称。
现在,f1 or f2
中的nil来自 f1
和f2
。错误消息可以提及f2
,但这会让人感到困惑。
如果你写这个,你会得到一个更好的错误信息:
f = f1 or f2
f()