Bienvenidos sean a este post, hasta ahora siempre que hablamos de userdata hemos hablado de userdata completo pero Lua ofrece otra especie de userdata conocido como userdata ligero.
Un userdata ligero es un valor que representa un apuntador de C, es decir un valor void *, debido a que este valor no lo creamos (de la misma forma que no creamos numeros) y para ingresarlo dentro de la pila usamos la llamada lua_pushlightuserdata:
void lua_pushlightuserdata(lua_State *L, void *p);
Mas alla de su nombre comun tanto el userdata ligero como el completo son bastante diferentes, el userdata ligero no posee buffers sino apuntadores, no tienen metatablas, al igual que los numeros el userdata ligero no necesita ser administrados por el recolector de basura. Algunas veces usamos este tipo de datos como una forma mas sencilla a la version completa, este no es su uso tipico pero con userdata ligero uno puede administrar la memoria porque no estan sujetas a la recoleccion de basura, al margen que de la version completa, mas alla de su nombre, no arrastran gran complejidad, ya que agregan poca sobrecarga comparados a un malloc para el tamaño de memoria informado.
El uso real de userdata ligero viene de la igualdad, como un userdata completo es un objeto, solo es igual consigo mismo, por otro lado un userdata ligero representa a un valor en un apuntador de C, como tal es igual la cualquier userdata que represente el mismo apuntador, por lo tanto podemos usar a userdata ligero para encontrar objetos de C dentro de Lua.
Un tipico escenario es suponer que estamos implementando un enlace entre Lua y un sistema de ventanas (Windows, KDE, Gnome, etc), en este enlace usamos userdata completo para representar las ventanas, cada userdata podria contener la estructura de la ventana entera o solo un apuntador para cada ventana creada por el sistema, cuando hay un evento dentro de cada ventana (p.e el click de un mouse), el sistema llama al metodo correspondiente, identificando a la ventana por su direccion, para pasar el metodo a Lua debemos encontrar el userdata que representa a la ventana informada, para encontrar este userdata podemos mantener una tabla donde los indices son los userdata ligeros con la direccion de la ventana y los valores son los userdata completos que representan las ventanas en Lua, una vez que tenemos la direccion de la ventana, la empujamos en la pila de la API como un userdata ligero y usamos este userdata como indice dentro de esa tabla, probablemente esta tabla deberia tener valores debiles de lo contrario estos userdata completos nunca serian recolectados.
En resumen, hoy hemos visto una alternativa que nos ofrece Lua para userdata, como es su estructura, los beneficios, la no tanta diferencia con respecto a los otros, como no se implementan en la vida real, y como se lo utiliza mas habitualmente, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.
Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.


Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50