Интегральные значения сводятся к строкам в 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)
_ EDIT _ :
Благодаря ответу Кевина Балларда и некоторому гуглению о том, как выполняется проверка типов внутри, я заметил 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
?