2010-07-05 10 views
1

Ruby a cette fonctionnalité très intéressante dans laquelle lorsque vous créez une classe avec 'Class.new' et l'assignez à une constante (majuscule), le langage "magiquement" configure le nom de la classe ça correspond à la constante. Il semble que ruby ​​"capture" l'affectation et insère le nom de la classe anonyme.lua - capturer des affectations de variables

J'aimerais savoir s'il existe un moyen de faire quelque chose de similaire dans Lua.

J'ai mis en place mon propre système de classe, mais à je travaille dois spécifier le même nom deux fois:

-- This is Lua code 
MyLuaClass = class('MyLuaClass', SuperClass) 
print(MyLuaClass.name) -- MyLuaClass 

Je voudrais vous débarrasser de cette chaîne 'MyLuaClass'. Y a-t-il un moyen de faire ça à Lua?

Répondre

4

Lors de l'affectation à des variables globales, vous pouvez définir une métaméthode __newindex pour la table des variables globales afin d'intercepter les affectations de variables de classe et de faire ce qui est nécessaire.

+0

Cela semble possible, mais pas très efficace; Je devrai invoquer une fonction lua chaque fois qu'une affectation globale est faite; pourrait ne pas être un gros problème si les affectations mondiales sont réduites au minimum. Je vais essayer, merci pour l'indice. – kikito

+5

Le coût d'invocation d'une fonction Lua n'est pas si élevé. Si vous avez des problèmes de performances, passez à C ou utilisez LuaJIT. Quelques appels de fonction, en particulier lors de ce type de configuration, sont négligeables. – Puppy

+0

C'était la meilleure approche. Merci! – kikito

2

Vous pouvez supprimer l'une des mentions de MyLuaClass ...

> function class(name,superclass) _G[name] = {superclass=superclass} end 
> class('MyLuaClass',33) 
> =MyLuaClass 
table: 0x10010b900 
> =MyLuaClass.superclass 
33 
> 
+0

C'était l'une de mes premières pistes de réflexion. Une autre utilisait une méthode __index sur class (ce qui serait une table) - donc ça irait comme ceci: class.MyLuaClass (superclass). Mais je voulais vraiment savoir à propos de la capture de cession, si c'était possible du tout. +1 pour vos efforts. – kikito

0

Pas vraiment. Lua n'est pas un langage orienté objet. Il peut se comporter comme un parfois. Mais loin de chaque fois. Les classes ne sont pas des valeurs spéciales dans Lua. Une table a la valeur que vous y mettez, pas plus. Le mieux que vous pouvez faire est de définir manuellement la clé dans _G à partir de la fonction de classe et d'éliminer d'avoir à prendre la valeur de retour. Je suppose que si VRAIMENT, vraiment vous dérange, vous pouvez utiliser debug.traceback(), obtenir une trace de pile, trouver le fichier appelant, et l'analyser pour trouver le nom de la variable. Ensuite, définissez cela. Mais c'est plus qu'un peu exagéré.

+0

Je ne veux pas que Lua se comporte comme un langage orienté objet à chaque fois. Je m'excuse si je vous ai donné cette impression. Je voulais juste savoir comment capturer des devoirs. Je vais continuer à chercher. – kikito

+0

@egarcia: Vous ne pouvez pas capturer des affectations. Lua n'a pas d'entrée pouvant être mise en correspondance pour l'assignation. Affectation dans une table, oui. Affectation en général, non. – Puppy

0

En ce qui concerne au moins Lua 5.2: Vous pouvez missions de capture à A) la table globale d'un État Lua, comme mentionné dans une réponse précédente, et aussi B) à tout autre Lua objet dont __index et __newindex métaméthodes ont été substitués (en remplaçant la metatable), ceci je peux confirmer que j'utilise actuellement ces deux techniques pour accrocher et rediriger des assignations faites par des manuscrits de Lua à la gestion externe de ressource de C/C++. Il y a un problème à les relire, l'astuce consiste à NE PAS laisser les valeurs être définies dans un état Lua. Dès qu'ils existent, vos hooks ne pourront pas être appelés, donc si vous voulez descendre ce chemin, vous devez capturer TOUTES les tentatives get/set, et ne JAMAIS stocker les valeurs dans un état Lua.