gpt4 book ai didi

lua - luaL_checknumber 和 lua_tonumber 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 06:06:24 26 4
gpt4 key购买 nike

澄清(对不起,问题不具体):他们都试图将堆栈中的项目转换为 lua_Number . lua_tonumber还将转换表示数字的字符串。怎么样luaL_checknumber处理不是数字的东西?

还有luaL_checklongluaL_checkinteger .它们是否与 (int)luaL_checknumber 相同和 (long)luaL_checknumber分别?

最佳答案

引用手册确实回答了这个问题。我引用了 Lua 5.2 引用手册,但在 5.1 手册中也有类似的文字。然而,手册非常简洁。很少有一个事实在一个以上的句子中被重述。此外,您通常需要关联在广泛分开的部分中陈述的事实,以了解 API 函数的更深层次的含义。

这不是缺陷,而是设计使然。这是该语言的引用手册,因此其主要目标是完整(且正确)描述该语言。

有关“如何”和“为什么”的更多信息,一般建议还阅读 Programming in Lua .在线副本在描述 Lua 5.0 时已经很长了。当前的纸质版本描述了 Lua 5.1,并且正在开发描述 Lua 5.2 的新版本。也就是说,即使是第一版也是一个很好的资源,只要您还注意自 5.0 版以来语言的变化。

引用手册中有很多关于 luaL_check* 的内容。函数族。

每个 API 条目的文档块都附带一个描述其使用堆栈的标记,以及在什么情况下(如果有)会抛出错误。这些 token 在 section 4.8 中描述:

Each function has an indicator like this: [-o, +p, x]

The first field, o, is how many elements the function pops from the stack. The second field, p, is how many elements the function pushes onto the stack. (Any function always pushes its results after popping its arguments.) A field in the form x|y means the function can push (or pop) x or y elements, depending on the situation; an interrogation mark '?' means that we cannot know how many elements the function pops/pushes by looking only at its arguments (e.g., they may depend on what is on the stack). The third field, x, tells whether the function may throw errors: '-' means the function never throws any error; 'e' means the function may throw errors; 'v' means the function may throw an error on purpose.



在将辅助库作为一个整体(官方 API 中名称以 luaL_ 而不仅仅是 lua_ 开头的所有函数)的第 5 章的开头,我们发现:

Several functions in the auxiliary library are used to check C function arguments. Because the error message is formatted for arguments (e.g., "bad argument #1"), you should not use these functions for other stack values.

Functions called luaL_check* always throw an error if the check is not satisfied.



函数 luaL_checknumber 用 token [-0,+0,v] 记录这意味着它不会干扰堆栈(它什么都不弹出也不压入)并且它可能会故意抛出一个错误。

其他具有更具体数字类型的函数主要在函数签名上有所不同。所有的描述都类似于 luaL_checkint() “检查函数参数 arg 是否是一个数字,并将这个数字转换为 int”,根据需要改变类型转换中命名的类型。

函数 lua_tonumber()用 token [-0,+0,-] 描述这意味着它对堆栈没有影响并且不会抛出任何错误。记录从指定的堆栈索引返回数值,如果堆栈索引不包含足够数字的内容,则返回 0。记录使用更通用的函数 lua_tonumberx()它还提供了一个标志,指示它是否成功转换了一个数字。

它也有以更具体的数字类型命名的 sibling ,它们执行所有相同的转换,但转换结果。

最后,您还可以引用源代码,并理解手册是按照预期的方式描述语言,而源代码是该语言的特定实现,可能有错误,或者可能会揭示实现细节在 future 的版本中可能会发生变化。

来源到 luaL_checknumber() lauxlib.c .可以看出是按照 lua_tonumberx()来实现的以及内部函数 tagerror()其中调用 typerror()这是通过 luaL_argerror() 实现的实际上抛出格式化的错误消息。

关于lua - luaL_checknumber 和 lua_tonumber 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12078432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com