Question

Lorsque je crée des liaisons Lua pour les classes C ++, dois-je renvoyer des tables ou des objets userdata?

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

Était-ce utile?

La solution

Je recommande de renvoyer les données utilisateur. Peu importe l'approche, il doit y avoir un endroit où mettre le pointeur aux données C ++, ou les données réelles C ++ elle-même, et il n'y a nulle part sûr de le faire avec une table.

Le retour des tables aurait du sens dans certaines situations, car elles peuvent être 'annoté' dans Lua avec des attributs supplémentaires sans qu'il soit nécessaire de le faire rien de plus pour soutenir cela. Malheureusement, le pointeur d'objet C ++ doit aller quelque part, et il n'y a nulle part où cela serait raisonnable d'aller ailleurs qu'une entrée réelle dans la table elle-même.

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

Ma préférence est donc de renvoyer des objets userdata. Ils peuvent être fait pour fonctionner comme des tables si on doit vraiment insister sur cela, mais ils avoir également un "secret" zone (la donnée utilisateur elle-même) où le C ++ pointeur d'objet peut être stocké, à l'abri d'écraser par le code Lua.

(Les objets Userdata ont également un pointeur "environnement", qui est un autre place pour stocker des données spécifiques à l'objet. Comme avec la charge utilisateur elle-même, cette valeur est inaccessible au code Lua et ne peut pas être endommagée de cette façon.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top