Setfenv () in Lua neu erstellen 5.2
Wie kann ich die Funktionalität von neu erstellen?setfenv
in Lua 5.2? Ich habe Probleme damit, genau zu verstehen, wie Sie das Neue verwenden sollen_ENV
Umgebungsvariable.
In Lua 5.1 können Sie verwendensetfenv
Sandbox jede Funktion ganz einfach.
--# Lua 5.1
print('_G', _G) -- address of _G
local foo = function()
print('env', _G) -- address of sandbox _G
bar = 1
end
-- create a simple sandbox
local env = { print = print }
env._G = env
-- set the environment and call the function
setfenv(foo, env)
foo()
-- we should have global in our environment table but not in _G
print(bar, env.bar)
Das Ausführen dieses Beispiels zeigt eine Ausgabe:
_G table: 0x62d6b0
env table: 0x635d00
nil 1
Ich möchte dieses einfache Beispiel in Lua 5.2 nachbauen. Unten ist mein Versuch, aber es funktioniert nicht wie im obigen Beispiel.
--# Lua 5.2
local function setfenv(f, env)
local _ENV = env or {} -- create the _ENV upvalue
return function(...)
print('upvalue', _ENV) -- address of _ENV upvalue
return f(...)
end
end
local foo = function()
print('_ENV', _ENV) -- address of function _ENV
bar = 1
end
-- create a simple sandbox
local env = { print = print }
env._G = env
-- set the environment and call the function
foo_env = setfenv(foo, env)
foo_env()
-- we should have global in our envoirnment table but not in _G
print(bar, env.bar)
Das Ausführen dieses Beispiels zeigt die Ausgabe:
upvalue table: 0x637e90
_ENV table: 0x6305f0
1 nil
Mir sind einige andere Fragen zu diesem Thema bekannt, aber sie scheinen sich hauptsächlich mit dem Laden von dynamischem Code (Dateien oder Zeichenfolgen) zu befassen, der mit dem neuen Code recht gut funktioniertload
Funktion in Lua 5.2. Hier frage ich speziell nach einer Lösung, um beliebige Funktionen in einer Sandbox auszuführen. Ich würde dies gerne tun, ohne das zu verwendendebug
Bibliothek. Nach Angaben der LuaDokumentation wir sollten uns nicht darauf verlassen müssen.