7
votes

Un moyen recommandé d'avoir plus de 2 modules se réfèrent récursivement à Lua 5.2

Y a-t-il un moyen d'avoir

  • Deux modules Lua (appelons-les A et b )
  • Chaque module utilise des fonctions de l'autre, elles doivent donc exiger les uns avec les autres
  • Un troisième module (appelons-le C ) peut utiliser A mais pas b E.g.

    c.lua : xxx

    • Il peut y avoir un autre module d qui nécessite b mais pas a e exigeant à la fois < Code> A et B
    • Ni A NOR B ni leurs membres ne doivent être ajoutés à l'espace de noms global.
    • Évitez d'utiliser le module et SETFENV Fonctions (obsolète en Lua 5.2)

      lié ​​: Lua - Comment puis-je utiliser une libère d'une autre? (Remarque: cette solution ne gère pas les dépendances circulaires.)


0 commentaires

3 Réponses :


6
votes

J'ai trouvé un moyen assez simple de le faire:

A.Lua : xxx

b.lua : xxx


3 commentaires

Y a-t-il un préjudice dans l'appelant exiger 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 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



3
votes

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

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.


0 commentaires

3
votes

Une autre méthode proposée par Owen Shepherd sur le lua-l Liste de diffusion :

Si nous définissons 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>

A.Lua: p> xxx pré>

b.lua:

local B = {}
package.loaded[...] = B

local A = require 'A'

function B.bar()
    return A.baz()
end

return B


1 commentaires

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 de retour à la fin de votre module est écrit sur package. ...] de toute façon (en utilisant cette structure de l'espace de noms global polluant non polluants et des tables de retour des modules)