2009-09-16 9 views
3

Lors de la création de liaisons Lua pour des classes C++, devrais-je retourner des tables ou des objets userdata?Liaisons Lua: table vs userdata

Quelqu'un connaît-il les avantages et les inconvénients de chaque méthode?

Répondre

6

Je recommande de retourner les données utilisateur. Indépendamment de l'approche, il doit y avoir un endroit où placer le pointeur vers les données C++, ou les données C++ proprement dites, et il n'y a nulle part sûr de le faire avec une table. Les tables de retour auraient du sens dans certaines situations, car elles peuvent être 'annotées' dans Lua avec des attributs supplémentaires sans avoir à faire quoi que ce soit d'autre pour supporter ceci. Malheureusement, le pointeur d'objet C++ doit aller quelque part, et il n'y a nulle part d'autre choix qu'une autre entrée réelle dans la table .

Ce n'est pas un endroit très sûr pour cela. Il peut être trouvé par le code Lua , et supprimé ou remplacé. Cela peut être par hasard, ou sur le but, cela n'a pas vraiment d'importance.

Ma préférence est donc de retourner des objets userdata. Ils peuvent être faits pour fonctionner comme des tables si on doit vraiment insister là-dessus, mais ils ont également une zone "secrète" (les données utilisateur elles-mêmes) où le pointeur d'objet C++ peut être stocké, sans risque d'écrasement par le code Lua.

(Userdata objets ont aussi un pointeur « environnement », ce qui est un autre endroit pour stocker des données spécifiques à l'objet. Comme la charge utile userdata lui-même, cette valeur est inaccessible au code Lua et ne peut pas être endommagé que chemin.)

+0

En plus de cela, les userdatas peuvent avoir un métaméthode __gc lié à eux afin que vous puissiez laisser Lua s'occuper de les collecter lorsqu'ils ne sont plus référencés. – Ignacio

+0

Très bien, merci! –