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