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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage