programa org nombre for lua

org - ¿Qué es userdata y lightuserdata en Lua?



lua roblox (4)

Bueno, los datos de usuario son datos del lado C que se pueden usar desde Lua. Como, por ejemplo, los manejadores de archivos como io.input son datos de usuario (intente imprimir (tipo (io.input))). Lo necesitará usted mismo si comienza a jugar con la C-API de Lua (o usa la función newproxy, que le proporciona un calendario de usuario vacío, en el que puede establecer una metatable (vea Características ocultas http://lua-users.org/wiki/HiddenFeatures ) en la wiki de usuarios de Lua).

Una buena introducción es: http://www.lua.org/pil/28.html

En cuanto a las funciones de las funciones de C: sí, solo puede registrar las funciones de C como funciones a las que llamar desde Lua, pero no obtendrá otros tipos de datos, punteros a datos en el lado de C, etc.

  • ¿Qué es userdata y lightuserdata en Lua?
  • Donde lo necesito

He estado tratando de envolver mi cabeza alrededor de ella por algún tiempo, pero parece que no puedo encontrar tutoriales / explicaciones que realmente entiendo.

¿Por qué los necesita, por qué no puede simplemente enlazar funciones C a metatatos Lua?


Primero, userdata significa full userdata. Aquí hay dos soluciones para implementar CharArray. Por favor ver más abajo:

//full userdata extern "C" int newarray(lua_State* L) { int n = luaL_checkint(L, 1); size_t nbytes = sizeof(CharArray) + (n - 1)*sizeof(char); CharArray* a = (CharArray*)lua_newuserdata(L, nbytes); a->size = n; return 1; } //light userdata extern "C" int newlarray(lua_State* L) { int n = luaL_checkint(L, 1); size_t nbytes = sizeof(CharArray) + (n - 1)*sizeof(char); CharArray* a = (CharArray*)(new char(nbytes)); lua_pushlightuserdata(L,a); a->size = n; return 1; }

Los datos de usuario completos son un área de memoria en bruto sin operaciones predefinidas que ofrece Lua . Por lo tanto, los datos de usuario deben ser gestionados por el recolector de basura. Por otro lado, light userdata es solo un valor que representa un puntero de C (es decir, un valor nulo *). Los datos de usuario ligeros no necesitan ser gestionados por el recolector de basura (y no lo son).


puede usar userdata Siempre que tenga cierta cantidad de datos que quiera que sea administrada por lua gc. Por ejemplo, podrías usarlo para objetos C ++. Algunos ejemplos para c ++: objetos con userdata: puede guardar uno en userdata y luego olvidarse de él en C ++, ya que lua lo gestionará. Por lo tanto, puede hacer referencia a él en luavariables y pasarlo a funciones que llaman a una función miembro del objeto c ++. (Hay formas de generalizar que, por supuesto, como poner un objeto de función genérica en los datos de usuario, vincularlo como un valor superior a un cierre C y registrar ese cierre c en un luaobjeto que representa el lado lua del objeto c ++, que involucra userdata también). Si no desea que lua gc administre sus objetos y solo desee hacer referencia a su objeto c ++ desde lua, puede guardar un puntero como datos de usuario ligeros.


Un dato de usuario es un valor recolectado de basura de un tamaño y contenido arbitrario. Usted crea uno desde la API de C, con lua_newuserdata() , que lo crea y lo empuja en la pila y le da un puntero a su contenido para que se inicie como mejor le parezca a C.

Es muy comparable a llamar a malloc() . Una distinción clave de malloc() es que nunca necesita llamar a free() , sino que simplemente permite que la última referencia a este se evapore y el recolector de basura finalmente reclamará su almacenamiento.

Son más útiles para retener datos que son útiles desde C, pero que deben administrarse desde Lua. Son compatibles con metatables individuales, que son la característica clave que permite vincular objetos C o C ++ a Lua. Simplemente rellena su metatable con métodos escritos en C que acceden, modifican y / o usan el contenido de los datos de usuario, y el resultado es un objeto al que se puede acceder desde Lua. Un buen ejemplo de esto es la biblioteca io , que almacena los punteros C FILE * en datos de usuario, y proporciona enlaces que implementan los métodos familiares de read , write y similares. Al implementar un __gc __gc, la biblioteca io se asegura de que uno de sus objetos de file cierre el FILE * asociado cuando se recopila.

Un ligero userdata es la forma en que representa un puntero a algo como un valor en Lua. Usted crea uno llamando a lua_pushlightuserdata() con el puntero que es su valor. Son manejados por Lua de la misma manera que un número. Son útiles cuando necesita nombrar un objeto C de manera que el nombre se pueda pasar dentro de Lua, pero Lua no administra la vida útil del objeto. Los números similares son iguales cuando tienen el mismo valor, los datos de usuario ligeros se comparan iguales cuando sostienen el mismo puntero. Al igual que los números, existen mientras estén en la pila o almacenados en una variable, y no tengan metatables individuales y no se recolecten basura.