Регистрация функции C в таблице Lua
Как зарегистрировать функцию C в Lua, но не в глобальном контексте, а как поле таблицы?
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
}
Это то, что 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.a
а также mod.b
,
Цитирование руководства для luaL_register(L,libname,l)
:
Когда вызывается с
libname
равноNULL
просто регистрирует все функции в спискеl
(увидетьluaL_Reg
) в таблицу на вершине стека.Когда вызывается с ненулевым
libname
,luaL_register
создает новую таблицуt
, устанавливает его как значение глобальной переменнойlibname
, устанавливает его как значениеpackage.loaded[libname]
, и записывает на него все функции в спискеl
, Если есть столик вpackage.loaded[libname]
или в переменнойlibname
, повторно использует эту таблицу вместо создания новой.В любом случае функция покидает таблицу сверху стека.
luaL_register()
может использоваться для помещения функций C в любую таблицу путем передачи NULL
для его второго параметра, пока таблица находится на вершине стека.