Целое число сокращается до строки при доступе через tostring / checkstring? - PullRequest
1 голос
/ 25 января 2011

Интегральные значения сводятся к строкам в 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?

1 Ответ

3 голосов
/ 25 января 2011

Согласно документации:

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

Проверяет, является ли аргумент функции narg строкой, и возвращает эту строку.

Эта функция использует lua_tolstring , чтобы получить ее результат, поэтому здесь применяются все преобразования и предостережения этой функции.

В документации к lua_tolstring сказано:Значение Lua должно быть строкой или числом ".Так что нет, Lua не хранит строки и числа одинаково внутри, но да, он имеет тенденцию конвертировать между ними по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...