Un userdata es un valor recolectado de basura de un tamaño y contenido arbitrario. Se crea uno de la API C, con lua_newuserdata()
, que crea y lo empuja en la pila y le da un puntero a su contenido para inicializar como mejor le parezca a partir de C.
Es muy comparable a llamar malloc()
. Una distinción clave de malloc()
es que nunca necesita llamar al free()
, sino que simplemente permite que la última referencia se evapore y el recolector de basura recuperará su almacenamiento eventualmente.
Son más útiles para almacenar datos que son útiles desde C, pero que deben ser administrados desde Lua. Admiten metatablas individuales, que son la característica clave que permite unir objetos C o C++ a Lua. Simplemente llene su metatabla con métodos escritos en C que acceden, modifican y/o utilizan el contenido de los datos del usuario, y el resultado es un objeto al que se puede acceder desde Lua. Un buen ejemplo de esto es el io
library, que almacena punteros C FILE *
en userdata, y proporciona enlaces que implementan los conocidos read
, write
y métodos similares. Al implementar un meta-método __gc
, la biblioteca io
se asegura de que uno de sus objetos file
cierre el FILE *
asociado cuando se recopila.
Un userdata de luz es la forma en que representa un puntero a algo como un valor en Lua. Crea uno llamando al lua_pushlightuserdata()
con el puntero que es su valor.Lua los maneja de la misma manera que un número. Son útiles cuando necesita nombrar un objeto C de forma que el nombre pueda transmitirse dentro de Lua, pero la vida del objeto no es administrada por Lua. Los números similares son iguales cuando tienen el mismo valor, los datos de usuario livianos se comparan iguales cuando tienen el mismo puntero. Como los números, existen siempre que estén en la pila o almacenados en una variable, y no tienen metatablas individuales y no son basura.
Se debe adjuntar un metatabla a * algo *, un userdatum es una opción razonable. – Textmode