Loadfile ohne die globale Umwelt zu verschmutzen

8

Wie kann ich eine Datei mit Lua-Tabellen und Variablen laden, ohne die globale Umgebung zu belasten? Da eine Load-Datei erstellt und ausgeführt wird, lädt sie einfach alles im globalen Bereich und überschreibt möglicherweise etwas anderes, was ich nicht möchte.

    
Milind 02.03.2012, 21:39
quelle

2 Antworten

10

In Lua 5.1 und ohne viel Fehlerbehandlung könnten Sie dies tun:

%Vor%

Die erste Zeile erstellt eine leere Umgebungstabelle, die alle vorhandenen globalen Variablen sehen kann, die sie jedoch nicht trivial ändern können, da sie nur durch den Proxy über das __index metamethod sichtbar sind. Alle globalen Variablen, die das Skript erstellt, werden in env gespeichert, was zurückgegeben wird. Dies funktioniert gut für einfache Skripts, die nur eine Reihe von Konfigurationsparametern festlegen und die möglicherweise einfache sichere Funktionen aufrufen müssen, um sie auf der Grundlage von Bedingungen zur Laufzeit festzulegen.

Beachten Sie, dass das Anzeigen der Globals für das Skript bequem ist. Obwohl die Globals nicht vom Skript in der offensichtlichen Weise modifiziert werden können, ist _G eine globale Variable, die einen Verweis auf die globale Umgebung enthält (mit _G._G , _G._G._G , etc ...) und _G kann sein modifiziert aus dem Skript, was zu weiteren Problemen führen könnte.

Anstatt also _G für den Index zu verwenden, wäre es viel besser, eine Tabelle zu erstellen, die nur Funktionen enthält, von denen man weiß, dass sie sicher sind und die der Autor des Skripts benötigt.

Eine vollständige Lösung wäre, das Skript in einer Sandbox auszuführen und möglicherweise weiter zu schützen, um eine versehentliche (oder vorsätzliche) Dienstverweigerung oder Schlimmeres zu verhindern. Sandboxes werden im Lua User's Wiki ausführlich behandelt. Das Thema ist tiefer als es auf den ersten Blick scheint, aber solange Ihre Benutzer nicht böswillig sind, sind praktische Lösungen einfach.

Lua 5.2 ändert die Dinge ein wenig, indem setfenv() zugunsten eines neuen Parameters in load() eliminiert wird. Details sind auch in der Wiki-Seite.

    
RBerteig 02.03.2012, 22:39
quelle
2

Hier ist eine dofile () Version von RBerteigs Antwort, wo Sie die Umgebung angeben und das Ergebnis, falls vorhanden, zurückgegeben wird (Ich habe versucht, dies als Kommentar zu tun , aber konnte nicht herausfinden, es zu formatieren):

%Vor%

Ich wollte in der Lage sein, mehrere Dateien in dieselbe Umgebung zu laden, und einige dieser Dateien enthielten ein "etwas zurückgeben". Danke, RBerteig, deine Antwort war hilfreich und lehrreich!

    
RAL 03.05.2013 20:06
quelle

Tags und Links