¿Cómo registrar una función C en Lua, pero no en un contexto global, sino como un campo de tabla?Registrar la función C en la tabla Lua
Respuesta
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
}
Esto es lo que luaL_register()
está destinado a hacer, para una o más funciones. El uso canónico es como parte de la instalación de un módulo escrito en 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;
}
donde esto crea un módulo denominado "mod" que tiene dos funciones con nombre mod.a
y mod.b
.
Citando el manual para luaL_register(L,libname,l)
:
Cuando se llama con
libname
igual aNULL
, simplemente registra todos funciones en la listal
(verluaL_Reg
) en la tabla en la parte superior de la pila .Cuando llama con un no nulo
libname
,luaL_register
crea una nueva tablat
, lo establece como el valor del mundial variableslibname
, lo establece como el valor depackage.loaded[libname]
y registros en él todas las funciones en la listal
. Si hay una tabla enpackage.loaded[libname]
o en la variablelibname
, reutiliza esta tabla en lugar de creando una nueva.En cualquier caso, la función deja la tabla en la parte superior de la pila.
luaL_register()
se puede utilizar para poner funciones de C en cualquier tabla haciendo pasar NULL
por su segundo parámetro, siempre y cuando la tabla se encuentra en la parte superior de la pila.
Si ya hay una tabla de modificaciones con otros campos, ¿se ampliará o reemplazará con una nueva después de la llamada a luaL_register()? –
reutilizará y actualizará una tabla anterior, de acuerdo con el manual 5.1. – u0b34a0f6ae
Si se aplica a una tabla global con nombre o a la tabla en la parte superior de la pila, solo establece los campos nombrados en la lista de funciones para registrar y deja intactos otros campos. La diferencia es que, dado un nombre global, también crea la tabla si es necesario y agrega una referencia a 'package.loaded'. – RBerteig
- 1. ¿Cómo creo una tabla Lua en C++ y la paso a una función Lua?
- 2. mesa dentro de la tabla en Lua
- 3. Referencia a la función Lua en C/C++
- 4. función Lua
- 5. Empujando una tabla Lua
- 6. iterar a través de la tabla Lua
- 7. Pase el objeto C++ a la función Lua
- 8. C++ llamar a la función lua con parámetros variables
- 9. Lua tabla de búsqueda
- 10. las funciones de llamada en una tabla Lua de C++
- 11. Lua - averiguar la función de llamada
- 12. Safe Lua invoke C++ función registrada
- 13. ¿Cómo paso una tabla de Lua a C++?
- 14. Inserción de pares de claves en la tabla de Lua
- 15. Incrustar Lua en C++
- 16. ¿Es posible/práctico usar la tabla hash de Lua fuera de Lua?
- 17. Llamar a la función Lua sin ejecutar el script
- 18. ¿Cómo puedo crear una tabla en Lua y luego agregar valores desde la API de C?
- 19. Incrustar Lua en C++
- 20. Lua: forma más inteligente de agregar a la tabla solo si no está ya en la tabla, o eliminar duplicados
- 21. eliminar la función en C++
- 22. Iterar a través de una tabla Lua de C++?
- 23. cómo crear tablas anidadas Lua usando la API C
- 24. ¿Puedo forzar la indexación de la tabla de Lua desde cero?
- 25. Cómo registrar cosas en la consola en Visual Studio C++
- 26. C++ CPU Registrar uso
- 27. ¿Defina una función hacia adelante en Lua?
- 28. Tratamiento de la fecha de usuario como una tabla en Lua
- 29. Compila lua incrustado en C
- 30. Acerca del wrapper y llame a la función C
¿Por qué no usar luaL_register? – uroc