Как зарегистрировать функцию C в Lua, но не в глобальном контексте, а как поле таблицы?Регистрация функции 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.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
для своего второго параметра, пока таблица находится на вершине стека.
Если уже есть таблица мод с другими полями, она будет расширена или заменена новой после вызова luaL_register()? –
он будет повторно использовать и обновлять предыдущую таблицу, в соответствии с руководством 5.1. – u0b34a0f6ae
Независимо от того, применяется ли она к названной глобальной таблице или таблице в верхней части стека, она только устанавливает те поля, имена которых указаны в списке функций для регистрации, и оставляет любые другие поля нетронутыми. Разница в том, что при глобальном имени он также создает таблицу, если это необходимо, и добавляет ссылку на 'package.loaded'. – RBerteig
- 1. Функции в таблице - Lua
- 2. Lua: пользовательские функции сравнения в таблице сортировки
- 3. wireshark development: Регистрация эвристической функции с несколькими протоколами в Lua
- 4. Lua - C++ Интеграция: функция вызова в таблице из C++
- 5. Передача функции Lua на C++
- 6. Вызов функции Lua из C++
- 7. Можно ли определить функции глобально в таблице Lua
- 8. ObjectiveC Lua: Ошибка в вызове функции C от Lua
- 9. SWIG: Lua - Передача экземпляра C++ в качестве параметра функции lua
- 10. Регистрация класса C++ для использования в Lua 5.2
- 11. Как использовать значение функции в таблице в lua
- 12. Преобразование функции C в функцию Lua
- 13. Преобразование функции контрольной суммы C в Lua
- 14. Вызов функций в таблице Lua из
- 15. Регистрация функции обратного вызова в C
- 16. Строка иерархии Lua в таблице
- 17. Присвоить таблицу таблице в Lua
- 18. Аргументы Lua, переданные функции в таблице, равны nil
- 19. Итерирование по таблице, переданной как аргумент функции в lua
- 20. Регистрация данных запроса в таблице
- 21. ООП в Lua От C
- 22. Lua - Выполнить функцию, сохраненную в таблице
- 23. Создание функции в Lua
- 24. функции в Lua
- 25. Определение функции в Lua
- 26. функция Lua в С ++ функции
- 27. Вызов функции Lua
- 28. Цитирование через столы в таблице в Lua
- 29. Настройка прототипа функции в Lua
- 30. вызов функции Lua из C++ условно
Почему бы просто не использовать luaL_register? – uroc