2016-08-01 38 views
2

In Vanille Lua 5.2 habe ich ein Modul, das enthält:Module jeweils andere lokale Objekte

  • Zwei lokale Funktionen, A und B: B wird ein Gespräch immer, A wird manchmal B anrufen und manchmal wird die in C gespeicherten Funktionen aufrufen;

  • C: eine Tabelle (lokal). Es enthält Tabellen, die Tabellen enthalten, die Tabellen enthalten können, die am Ende Funktionen enthalten. Diese Funktionen können entweder A oder B anrufen;

  • Dann gibt es die Rückgabe-Funktion, D, die zurückgegeben wird, wenn mein Modul mit require geladen wird. Es ruft A.

Am Ende, es sieht ganz so aus:

--don't pay attention to what the functions do: 
--I am only writing them down to explain how they interact with each other 

local A, B, C 

C = { 
    ... 
    { 
     function(a) 
      B(a) 
     end 
    } 
    ... 
} 

A = function(a) 
    ... 
    if (...) then 
     B(a) 
    end 
    ... 
    if (...) then 
     C[...]...[...](a) 
    end 
    ... 
end 

B = function(a) 
    A(a) 
end 

return function(s) -- we called this one D 
    A(s) 
end 

Nun, mein Problem ist folgendes: die Deklaration von C verwendet eine eigene lokale Variablen, Metatables und alles, was Sachen, zu dem Punkt, den ich seine Deklaration in einem Block do ... end beifügte.

Es ist auch - mit all diesen Tabellen in Tabellen und Zeilenumbrüche für jede geschweifte Klammer und Einzug und so weiter - ziemlich lang. Also wollte ich es in ein eigenes Modul stecken, aber dann konnte es nicht auf B.

Also meine Frage ist: gibt es eine Möglichkeit, B und vielleicht sogar A an die Datei übergeben, wo C beim Laden deklariert wird es? Ich meine, so etwas wie diese, wenn es möglich wäre:

--in the original module 
local A, B, C 

C = require("c", A, B) 

... 

Und dann, in c.lua:

local A, B = select(1, ...), select(2, ...) 

C = { 
    ... 
    { 
     function(a) 
      B(a) 
     end 
    } 
    ... 
} 

Ich habe wirklich keine Ahnung, wie es zu tun.

Gibt es eine Möglichkeit, Variablen von der erforderlichen Datei an die erforderliche Datei zu übergeben, bei der die Variablen nicht in den globalen Namespace eingefügt werden?

Antwort

2

Hauptmodul:

local A, B, C 

A = function(a) 
    ... 
    if (...) then 
     B(a) 
    end 
    ... 
    if (...) then 
     C[...]...[...](a) 
    end 
    ... 
end 

B = function(a) 
    A(a) 
end 

C = require("c")(A, B) 

return function(s) -- we called this one D 
    A(s) 
end 

c.lua:

local function C_constructor(A, B) 
    local C = 
     { 
      ... 
      { 
       function(a) 
        B(a) 
       end 
      } 
      ... 
     } 
    return C 
end 

return C_constructor 
+0

Das ist clever, wirklich clever. – user6245072

0

Gibt es eine Möglichkeit, Variablen von der erforderlichen Datei an die erforderliche Datei zu übergeben, bei der die Variablen nicht in den globalen Namespace eingefügt werden?

nicht mit dem Standard-require Funktion, aber das sollte Sie nicht vom Schreiben Sie Ihre eigene require Stopp-Funktion, die dies tut. Offensichtlich wird dies die für Ihre Anwendung spezifische Lösung ergeben, so dass diese erforderlichen Dateien nicht korrekt funktionieren, wenn ein Standard-Lua-Interpreter (mit seiner -Funktion) verwendet wird.

+0

die tatsächlich _will_ mich zu stoppen lol. Ich schreibe eigentlich keine eigenständige Anwendung, und ich werde eines Tages die ganze Codebasis auf C oder C++ übertragen, also warum? – user6245072