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.
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!
Tags und Links lua lua-loadfile