2017-04-11 2 views
1

Lua API a une fonction lua_getmetatable qui va chercher la table avec des métafonctions si la valeur en a une.
La bibliothèque auxiliaire de Lua (qui fait partie de API lua) a une autre fonction luaL_getmetatable qui est une macro qui aura une valeur de LUA_REGISTRYINDEX. Mais une autre fonction de cette bibliothèque luaL_getmetafield ne correspond pas à ce que vous attendez d'elle - elle recherchera une méthode dans l'emplacement get_metatable.Quelle est la différence entre lua_getmetatable et luaL_getmetatable

Pourquoi existe-t-il deux emplacements différents? Quand est-ce que chaque métatable est utilisée?

Répondre

4

lua_getmetatable obtient la métatable associée à l'objet donné. Ceci est une caractéristique fondamentale; si cette fonction n'existait pas, il n'y aurait aucun moyen d'accéder à la métatable pour un objet donné.

luaL_getmetatable fait partie d'une convention pour donner des types à des données utilisateur (objets C accessibles depuis Lua) ou à des classes de tables. Dans cette convention, vous ajoutez des tables au registre avec luaL_newmetatable, puis utilisez ces tables pour représenter les métadonnées pour différents types de données/tables d'utilisateurs (lorsque vous en avez besoin, vous pouvez les lire dans le registre et les définir avec luaL_setmetatable).

Ceci est une fonctionnalité de commodité seulement; et vous n'avez pas besoin de suivre cette convention si vous ne le souhaitez pas. Tout fonctionnera toujours si vous placez les tables de métadonnées quelque part qui ne sont pas dans le registre et les liez à vos données utilisateur avec lua_setmetatable. Cela dit, si les fonctions luaL_*metatable n'existaient pas, où placeriez-vous les tables que vous utilisiez pour représenter les différents types userdata/table; et comment les retrouveriez-vous quand vous en auriez besoin une seconde fois? Vous pouvez certainement résoudre ce problème d'une manière différente, mais pourquoi ne pas utiliser la convention prédéfinie si cela fonctionne pour vous.