Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.06.2011, 13:55

LUA Importfunktion

Hi,
Ich würde gerne in einer Lua-Datei eine andere einbinden, allerdings nicht so, wie es dofile tut, da nicht die variablen der Datei überschrieben werden sollen. Am Besten gebe ich ein Beispiel:
Die Einzubindende Datei (file.lua):

Quellcode

1
2
3
4
a=10
function test()
    print("hi")
end

Die aufrufende Datei:

Quellcode

1
2
3
4
5
6
7
8
a=1
dies = import("file.lua")
print(a)--sollte 1 zeigen
print(dies.a)--sollte 10 sein
dies.test()--sollte hi ausgeben
--oder auch
jenes = import("file.lua").test
jenes()--sollte ebenfalls hi ausgeben

Also im großen und ganzen möchte ich, das die Variablen und Funktionen der eingebundenen Datei nicht global gespeichert werden, sondern in eine Tabelle geschrieben werden, von der aus man sie dann aufrufen kann, ohne das die alten Variablen überschrieben werden.
Ich habe da auch schon einiges versucht, aber es funktioniert nicht so, wie es soll.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function import(name)
    local oldenv = {}
    for i,j in pairs(_G) do
        oldenv[i]=j;
    end--über for-Schleife, weil sonst anscheinend oldenv ein pointer auf _G ist
    dofile(name)
    local newenv = {}
    for i,j in pairs(_G) do
        newenv[i]=j;
    end--selber Grund
    _G={}--wenn _G nicht erst ganz gelöscht wird funktioniert es irgendwie nicht
    _G=oldenv
    return newenv--sollte alle Variablen und Funktionen der importierten Datei enthalten (Plus die der importierenden, das ist aber egal)
end

Das ganze Funktioniert soweit, aber mein Ziel ist nicht erreicht.
Zwar sind die Variablen, die importiert wurden nicht in _G, aber sie sind trotzdem aufrufbar (weswegen ist mir schleierhaft) und überschreiben ihre Vorgänger.
Auch der Returnwert ist richtig und ich kann die Funktionen/Variablen auch über diesen ansprechen, das einzige Problem ist, das sie ja nicht die schon vorhandenen Variablen überschreiben sollen.

Schonmal vielen Dank für eure Hilfe, ich hoffe das Problem ist lösbar.

2

07.07.2011, 11:30

Inzwischen habe ich es selbst herausgefunden, es ist zwar keine ganz optimale Methode, doch sie erfüllt ihren Zweck und bewirkt genau das was ich haben wollte. Für den Fall, das nochmal irgendwann ein anderer das Problem hat, hier meine Lösung:

Quellcode

1
2
3
4
5
6
7
8
9
function Import(name)
    local file = io.open(name, "r")
    local filestring = file:read("*a")
    file:close()
    local addstring = "local _packagedata = {}\n_importdata = _packagedata\nsetmetatable(_packagedata, {__index = _G})\nsetfenv(1, _packagedata)\n"
    local totalstring = addstring..filestring;
    loadstring(totalstring)()
    return _importdata
end

Man darf in diesem Fall nur die Variable _importdata im Importierenden Script und die Variable _packagedata im importierten Script nicht benutzen, das sollte aber vermeidbar sein.