2009-09-13 12 views
13

Tengo una función anidada relativamente profundamente en un conjunto de tablas. ¿Hay alguna forma en C/C++ para obtener una "referencia" a esa función y presionar esa (y args) en la pila cuando necesito usarla?Referencia a la función Lua en C/C++

Respuesta

20

Esto es lo que el reference system es para. La función llamada r = luaL_ref(L, LUA_REGISTRYINDEX) almacena el valor en la parte superior de la pila en el registro y devuelve un número entero que se puede almacenar en el lado C y se usa para recuperar el valor con la llamada de función lua_rawgeti(L, LUA_REGISTRYINDEX, r).

Consulte el PiL chapter, así como la documentación de luaL_ref(), lua_rawgeti() y luaL_unref() para la historia completa.

2

La API de Lua (http://www.lua.org/manual/5.1/manual.html#3) se puede utilizar para acceder a los miembros de la tabla que desee. Utilice lua_gettable() para extraer un miembro de la tabla y colocarlo en la pila lua, si el miembro también es una tabla simplemente llame a lua_gettable() nuevamente para acceder a esta tabla, y así sucesivamente ...

(Dependiendo de lo que estamos haciendo lua_rawget() podría ser una mejor opción que lua_gettable())

Addtional en respuesta al comentario:

está bien eso es un poco más interesante. Bueno, una tabla es un objeto de referencia (más o menos), por lo que probablemente sea seguro guardar la referencia de tabla más interna en alguna parte.

Dado que la API de lua no parece tener de todos modos manipular directamente las referencias de tabla, probablemente tendrá que insertar la referencia en una tabla global, o si eso no funciona, una nueva tabla con una sola entrada de tabla. Cuando quieras la referencia más tarde, solo obténgala de lo global.

p. Ej.

// Final table reference is now at top of stack, after multiple dereferences 
lua_setglobal(L, "mytableref"); 
+0

Ya sé cómo hacerlo :) Quiero obtener una función a la que se hace referencia anidada profundamente en las tablas para que luego pueda llamar a la función sin atravesar todas esas tablas. – jameszhao00

+0

[Agregado a respuesta] –

Cuestiones relacionadas