Une donnée d'utilisateur est une valeur collectée par la corbeille d'une taille et d'un contenu arbitraires. Vous en créez un à partir de l'API C, avec lua_newuserdata()
, qui le crée et le pousse sur la pile et vous donne un pointeur sur son contenu pour l'initialiser comme vous le souhaitez.
Il est très comparable à l'appel malloc()
. Une distinction clé par rapport à malloc()
est que vous n'avez jamais besoin d'appeler free()
, vous autorisez simplement la dernière référence à s'évaporer et le garbage collector va récupérer son stockage.
Elles sont très utiles pour conserver des données utiles à partir de C, mais qui doivent être gérées à partir de Lua. Ils prennent en charge les métadonnées individuelles, qui sont la fonctionnalité clé permettant de lier des objets C ou C++ à Lua. Vous remplissez simplement sa metatable avec des méthodes écrites en C qui accèdent, modifient et/ou utilisent le contenu des données utilisateur, et le résultat est un objet accessible depuis Lua. Un bon exemple de ceci est le io
library, qui stocke les pointeurs C FILE *
dans userdata, et fournit des liaisons qui implémentent les méthodes familières read
, write
et similaires. En implémentant un métaméthode __gc
, la bibliothèque io
s'assure qu'un de ses objets file
ferme le FILE *
associé lorsqu'il est collecté. Un léger userdata est comment vous représentez un pointeur vers quelque chose comme une valeur dans Lua. Vous en créez un en appelant le lua_pushlightuserdata()
avec le pointeur correspondant à sa valeur.Ils sont gérés par Lua de la même manière qu'un certain nombre. Ils sont utiles lorsque vous devez nommer un objet C de telle sorte que le nom puisse être transmis dans Lua, mais la durée de vie de l'objet n'est pas gérée par Lua. Les nombres identiques sont égaux lorsqu'ils ont la même valeur, les données userdata légères sont égales lorsqu'elles contiennent le même pointeur. Comme les nombres, ils existent aussi longtemps qu'ils sont sur la pile ou stockés dans une variable, et ils n'ont pas de métabalies individuelles et ils ne sont pas collectés.
Une méta-donnée doit être attachée à * quelque chose *, une userdatum est un choix raisonnable. – Textmode