Как зарегистрировать функцию C в Lua, но не в глобальном контексте, но как поле таблицы?
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», который имеет две функции с именами 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
в качестве второго параметра, пока таблица находится на вершине стека.