2010-04-25 6 views

Respuesta

5
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 
} 
+4

¿Por qué no usar luaL_register? – uroc

20

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 a NULL, simplemente registra todos funciones en la lista l (ver luaL_Reg) en la tabla en la parte superior de la pila .

Cuando llama con un no nulo libname, luaL_register crea una nueva tabla t, lo establece como el valor del mundial variables libname, lo establece como el valor de package.loaded[libname] y registros en él todas las funciones en la lista l. Si hay una tabla en package.loaded[libname] o en la variable libname, 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.

+0

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()? –

+0

reutilizará y actualizará una tabla anterior, de acuerdo con el manual 5.1. – u0b34a0f6ae

+0

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