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

时间:2014-11-28 01:53:58

标签: 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)

2 个答案:

答案 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来自 f1f2。错误消息可以提及f2,但这会让人感到困惑。

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

f = f1 or f2
f()