Зарегистрируйте функцию C в таблице Lua

Как зарегистрировать функцию C в Lua, но не в глобальном контексте, но как поле таблицы?

10
задан topright gamedev 25 April 2010 в 22:16
поделиться

2 ответа

void register_c_function(char const * const tableName, char const * const funcName, CFunctionSignature funcPointer)
{
    lua_getfield(lstate, LUA_GLOBALSINDEX, tableName);  // push table onto stack
    if (!lua_istable(lstate, -1))                       // not a table, create it
    {
        lua_createtable(lstate, 0, 1);      // create new table
        lua_setfield(lstate, LUA_GLOBALSINDEX, tableName);  // add it to global context

        // reset table on stack
        lua_pop(lstate, 1);                 // pop table (nil value) from stack
        lua_getfield(lstate, LUA_GLOBALSINDEX, tableName);  // push table onto stack
    }

    lua_pushstring(lstate, funcName);       // push key onto stack
    lua_pushcfunction(lstate, funcPointer); // push value onto stack
    lua_settable(lstate, -3);               // add key-value pair to table

    lua_pop(lstate, 1);                     // pop table from stack
}
5
ответ дан 3 December 2019 в 16:29
поделиться

Это то, что luaL_register () предназначено для одной или нескольких функций. Каноническое использование является частью настройки модуля, написанного на C:

/* actual definitions of modA() and modB() are left as an exercise. */

/* list of functions in the module */
static const luaL_reg modfuncs[] =
{
    { "a", modA},
    { "b", modB},
    { NULL, NULL }
};

/* module loader function called eventually by require"mod" */  
int luaopen_mod(lua_State *L) {
    luaL_register(L, "mod", modfuncs);
    return 1;
}

, где создается модуль с именем «mod», который имеет две функции с именами mod.a и mod.b .

Цитата из руководства для luaL_register (L, libname, l) :

При вызове с libname , равным NULL , он просто регистрирует все функции в списке l (см. luaL_Reg ) в таблице наверху стека .

При вызове с ненулевым имя библиотеки , luaL_register создает новую таблицу t , устанавливает ее как значение глобальной переменной libname , устанавливает его как значение для package.loaded [libname] и регистров на нем все функции в списке l . Если есть таблица в package.loaded [libname] или в переменной libname , повторно использует эту таблицу вместо создания новенький.

В любом случае функция оставляет таблицу наверху стека.

luaL_register () может использоваться для помещения функций C в любую таблицу путем передачи NULL в качестве второго параметра, пока таблица находится на вершине стека.

20
ответ дан 3 December 2019 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: