在Lua中,积分值会减少到字符串吗?我已经尝试追踪一个错误了整整一个小时,当我意识到数字与字符串相同时,给出以下代码:
main.c中:
#include <stdio.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
int ex_dummyfunc(lua_State* L)
{
const char* first = luaL_checkstring(L, 1);
int second = luaL_checkinteger(L, 2);
printf("first = %s, second = %d\n", first, second);
return 0;
}
int main(int argc, char *argv[])
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "dummyfunc", ex_dummyfunc);
if(argc > 1)
{
if(luaL_dofile(L, argv[1]) == 1)
{
fprintf(stderr, "error: %s\n", lua_tostring(L, 1));
}
}
lua_close(L);
return 0;
}
test.lua:
dummyfunc("stuff", 42)
dummyfunc(42, 8)
dummyfunc(82, "stuff")
输出:
first = stuff, second = 42
first = 42, second = 8
error: test.lua:4: bad argument #2 to 'dummyfunc' (number expected, got string)
_ 修改 _ :
感谢answer by Kevin Ballard,以及一些关于如何在内部执行类型检查的谷歌搜索,我注意到luaL_checktype
,它允许基于令牌的类型实施。因此,要强制执行字符串参数,需要以这种方式编辑函数ex_dummyfunc
:
int ex_dummyfunc(lua_State* L)
{
luaL_checktype(L, 1, LUA_TSTRING);
const char* first = luaL_checkstring(L, 1);
int second = luaL_checkinteger(L, 2);
printf("first = %s, second = %d\n", first, second);
return 0;
}
为什么Lua在第二次调用dummyfunc
时没有抛出类型错误?
答案 0 :(得分:3)
根据文件:
const char * luaL_checkstring (lua_State * L,int narg);
检查 函数参数narg是否为 一个字符串并返回此字符串。
此功能使用lua_tolstring来 得到它的结果,所有转换和 该功能的警告适用于此。
在lua_tolstring的文档中,它说“Lua值必须是字符串或数字”。所以不,Lua内部不存储字符串和数字,但是,它确实倾向于在必要时在两者之间进行转换。