2010-07-23 4 views
2

J'apprends comment lier des objets C++ à Lua avec la vérification de type du livre Programming Gems 6 (Chapitre 4.2). Pour le type de vérification les paires userdata/chaîne sont stockées dans une table de l'environnement, avec le code donné comment faire:Pourquoi appuyer sur une touche en double lors de l'ajout à une table dans Lua?

void Binder::pushusertype(void* udata, const char* tname) { 
lua_pushlightuserdata(L, udata); // push address 
lua_pushvalue(L, -1); // duplicate address 
lua_pushstring(L, tname); // push type name 
lua_rawset(L, LUA_ENVIRONMENTINDEX); // envtable[address] = tname 
} 

Lorsque la classe Binder a un État Lua comme un attribut, nommé « L »

Comme vous pouvez le voir l'adresse est poussée deux fois. Comme ce petit morceau de code n'est donné qu'à titre d'exemple, il ne semble pas qu'une adresse dupliquée poussée sur la pile puisse servir à quelque chose en dehors de cette fonction, ce qui me porte à croire qu'il y a une raison spécifique à cela. Alors ma question est, pourquoi ferait-on cela?

Répondre

2

Ce n'est pas le cas.

Le lua_rawset affichera le nom & le doublon de la pile, mais laissera les données d'utilisateur d'origine sur la pile. Je ne suis pas sûr si c'est une faute de frappe (semble improbable), je suppose que cela pourrait être nécessaire plus tard. Je ne sais pas s'il y en a d'autres dans le livre, qui le mentionne, mais c'est ce que fera le code.

2

Cette fonction fait deux choses:

il pousse un objet lightuserdata à la pile, et il sera à la position de la pile de lua -1 lorsque la fonction retourne. Il met également à jour l'environnement de la fonction en cours avec le nom tname stocké à la clé de table address (égale à udata). Si l'environnement actuel de la fonction est l'environnement mondial normal, le code équivalent Lua serait:

local x = <udata as lightuserdata> 
_G[x] = <tname> 

Un double de x est utilisé pour faire la chose _G[x] = ..., l'autre est à gauche sur la pile lorsque la fonction retourne (constante avec le nom de la fonction qui commence par push).

Questions connexes