Y a-t-il un moyen d'avoir
A code> et b code>) li>
- Chaque module utilise des fonctions de l'autre, elles doivent donc
exiger code> les uns avec les autres li>
- Un troisième module (appelons-le
C code>) peut utiliser A code> mais pas b code> E.g. li>
ul> c.lua code>: p> xxx pré>
- Il peut y avoir un autre module
d code> qui nécessite b code> mais pas a ou ou e code> exigeant à la fois < Code> A code> et B code> li>
- Ni
A code> NOR B code> ni leurs membres ne doivent être ajoutés à l'espace de noms global. Li>
- Évitez d'utiliser le module code> et
SETFENV CODE> Fonctions (obsolète en Lua 5.2) Li>
ul>
lié fort>: Lua - Comment puis-je utiliser une libère d'une autre? (Remarque: cette solution ne gère pas les dépendances circulaires.) p> p>
3 Réponses :
J'ai trouvé un moyen assez simple de le faire:
A.Lua code>: p>
b.lua Code>: p>
Y a-t-il un préjudice dans l'appelant exiger code> dans une fonction comme celle-ci? Je ne l'ai jamais vu que jamais utilisé au niveau supérieur.
Il n'y a pas d'avertissement dans le Manuel de référence à ce sujet, donc je pense que c'est sûr.
Vous pouvez utiliser besoin code> n'importe où dans le code. Par exemple, j'utilise souvent cet idiome pour démarrer le REMDEBUG à un point donné dans le fichier:
si la somécontion nécessite alors "REMDEBUG.Engine'.Start () fin code>
Un moyen standard de le faire dans n'importe quelle langue est d'introduire un médiateur. Les modules peuvent ensuite publier et abonner au médiateur. http://fr.wikipedia.org/wiki/mediator_pattern P>
Un exemple de ceci dans mes langues est le bus MVCCONTRIB, IEVENTAGGRGERGULATEUR et la classe MVVM Lite Messenger. Ils font tous la même chose. P>
Une autre méthode proposée par Owen Shepherd sur le lua-l Liste de diffusion :
Si nous définissons A.Lua: p> b.lua: package.Load [ nom de module actuel em>] code> en haut de chaque module, puis tout autre module
Exiger code> d ultérieurement peut faire référence au module actuel (éventuellement incomplet). p>
local B = {}
package.loaded[...] = B
local A = require 'A'
function B.bar()
return A.baz()
end
return B
Si vous ne souhaitez pas appeler, exigez tout le temps (dans chaque fonction décrite par Finnw 'Autre solution ), On dirait que c'est la seule façon de partir. IMHO C'est assez gentil aussi depuis que le nom code> de retour code> à la fin de votre module est écrit sur package. ...] code> de toute façon (en utilisant cette structure de l'espace de noms global polluant non polluants et des tables de retour des modules)