luaL_checknumber和lua_tonumber有什么区别?

Elo*_*off 8 lua

澄清(抱歉问题不具体):他们都试图将堆栈上的项目转换为lua_Number.lua_tonumber还将转换表示数字的字符串.如何luaL_checknumber处理不是数字的东西?

还有luaL_checklongluaL_checkinteger.它们分别是(int)luaL_checknumber(long)luaL_checknumber

RBe*_*eig 12

参考手册确实回答了这个问题.我引用了Lua 5.2参考手册,但同样的文本也可以在5.1手册中找到.但是,手册非常简洁.任何单一事实很难在一个以上的句子中重述.此外,您经常需要关联广泛分离的部分中陈述的事实,以了解API函数的深层含义.

这不是缺陷,而是设计上的缺陷.这是该语言的参考手册,因此其主要目标是完全(和正确)描述该语言.

有关"如何"和"为什么"的一般建议的更多信息,请阅读Lua中的编程.由于它描述了Lua 5.0,因此在线版本的版本相当长.目前的纸质版本描述了Lua 5.1,并且正在编写一个描述Lua 5.2的新版本.也就是说,即使是第一版也是一个很好的资源,只要你也注意自5.0版本以来语言的变化.

参考手册有很多关于luaL_check*功能族的说法.

每个API条目的文档块都附有一个描述其对堆栈使用的标记,并且在什么条件下(如果有的话)它将引发错误.这些令牌在4.8节中描述:

每个函数都有一个这样的指标: [-o, +p, x]

第一个字段o是函数从堆栈弹出的元素数量.第二个字段p是函数推入堆栈的元素数量.(任何函数在弹出其参数后总是推送其结果.)x | y形式的字段表示函数可以推送(或弹出)x或y元素,具体取决于具体情况; 审讯标记'?' 意味着我们无法通过仅查看其参数来知道函数弹出/推送的元素数量(例如,它们可能取决于堆栈上的内容).第三个字段x告诉函数是否可能抛出错误:' - '表示函数从不抛出任何错误; 'e'表示函数可能会抛出错误; 'v'表示函数可能故意抛出错误.

在第5章的头部,它记录了整个辅助库(官方API中的所有函数,其名称以luaL_而不仅仅是开头lua_),我们发现:

辅助库中的几个函数用于检查C函数参数.因为错误消息是为参数格式化的(例如,"bad argument#1"),所以不应将这些函数用于其他堆栈值.

如果不满足检查,则称为luaL_check*的函数总是抛出错误.

该函数luaL_checknumber记录有令牌[-0,+0,v],这意味着它不会干扰堆栈(它不会弹出任何内容并且什么也不推送),并且可能故意抛出错误.

具有更多特定数字类型的其他函数主要在函数签名中有所不同.所有内容的描述类似于luaL_checkint()"检查函数参数arg是否为数字并将此数字转换为int",根据需要改变强制转换中指定的类型.

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

它也有以更具体的数字类型命名的兄弟姐妹,它们进行所有相同的转换但是转换结果.

最后,还可以参考源代码,并理解手册是按照预期描述语言,而源是该语言的特定实现,可能有错误,或者可能揭示实现的详细信息.可能会在未来的版本中更改.

来源luaL_checknumber()lauxlib.c.可以看出在以下方面得到执行lua_tonumberx()和内部功能,tagerror()这就要求typerror()它与实现luaL_argerror()实际抛出的格式错误消息.