2012-12-20 13 views
8

Problem

Wie kann ich den folgenden Fehler von Lua 5.1 vermeiden, wenn Sie versuchen, eine zirkuläre erfordern?Lua: Wie zu vermeiden Rundschreiben Erfordert

$ lua main.lua 
lua: ./bar.lua:1: loop or previous error loading module 'foo' 
stack traceback: 
    [C]: in function 'require' 
    ./bar.lua:1: in main chunk 
    [C]: in function 'require' 
    ./foo.lua:1: in main chunk 
    [C]: in function 'require' 
    main.lua:1: in main chunk 
    [C]: ? 

Dateistruktur

main.lua

require "foo" 
require "bar" 
print (Foo.getName()) 
print (Bar.getName()) 

foo.lua

require 'bar' 
Foo = {} 
Foo.name = 'foo' 

function Foo:getName() 
    return Foo.name .. Bar.name 
end 

bar.lua

require 'foo' 
Bar = {} 
Bar.name = 'bar' 

function Bar:getName() 
    return Bar.name .. Foo.name 
end 

Erwartete Ausgabe

$ lua main.lua 
foobar 
barfoo 
+3

Eng verwandt (aber für Lua5.2, und vermeiden Globals): http: // Stackoverflow.com/questions/8248698/empfohlen-way-to-have-2-modules-rekursiv-beziehen-auf-jedes-in-lua-5-2 – finnw

Antwort

8

Lösung

main.lua

Foo = Foo or require "foo" 
Bar = Bar or require "bar" 
print (Foo.getName()) 
print (Bar.getName()) 

foo.lua

Foo = {} 
Bar = Bar or require "bar" 
Foo.name = 'foo' 

function Foo:getName() 
    return Foo.name .. Bar.name 
end 

return Foo 

bar.lua

Bar = {} 
Foo = Foo or require "foo" 
Bar.name = 'bar' 

function Bar:getName() 
    return Bar.name .. Foo.name 
end 

return Bar 

Erklärung

Da Sie globale Variablen setzen, können Sie überprüfen, ob die Datei bereits (auch bekannt als erforderlich wurde; die globale bereits definiert ist), bevor ein weiterer Versuch erfordern:

Bar = Bar or require "bar" 

Ihre bar.lua würde dann die Definition der Bar haben zurückzukehren;

Bar = {} 
-- ... 
return Bar 

lösen Dies wird nicht ganz die Frage, wie bar.lua erwartet Foo definiert werden. Um dies zu beheben, können Sie eine Dummy-Variable mit dem gleichen Namen definieren:

Foo = {} 
Bar = Bar or require "bar" 

Dies ist nur möglich, weil Sie die Verwendung von Foo zu werden aufzuschieben, wenn die Funktion aufgerufen wird. Wenn Sie Foo.name aus dem Bereich bar.lua aufrufen möchten, würden Sie das gleiche zirkuläre Abhängigkeitsproblem haben.

10

Eine andere Möglichkeit, dieses Problem zu lösen, wäre, die Struktur des Codes zu ändern und die "gegenseitige" Funktionalität in ein drittes Modul zu extrahieren, das sowohl Foo als auch Bar erfordern würde.

+1

Letztendlich ist dies sicherlich der Ansatz, den ich nehme, die eine viel bessere bietet Abhängigkeitsbaum In diesem Fall war ich neugierig auf eine Lösung, die zirkuläre Abhängigkeiten erlaubte. Vielen Dank! –

Verwandte Themen