通过tostring / checkstring访问时,整数会减少为字符串吗?

时间:2011-01-25 07:27:37

标签: c lua

在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时没有抛出类型错误?

1 个答案:

答案 0 :(得分:3)

根据文件:

  

const char * luaL_checkstring   (lua_State * L,int narg);

     

检查   函数参数narg是否为   一个字符串并返回此字符串。

     

此功能使用lua_tolstring来   得到它的结果,所有转换和   该功能的警告适用于此。

在lua_tolstring的文档中,它说“Lua值必须是字符串或数字”。所以不,Lua内部不存储字符串和数字,但是,它确实倾向于在必要时在两者之间进行转换。