Воссоздание setfenv () в Lua 5.2

Как я могу воссоздать функциональностьsetfenv в Lua 5.2? У меня возникли проблемы с пониманием, как именно вы должны использовать новый_ENV переменная окружения.

В Lua 5.1 вы можете использоватьsetfenv песочница любой функции довольно легко.

--# 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)

Выполнение этого примера показывает вывод:

_G    table: 0x62d6b0
env   table: 0x635d00
nil   1



Я хотел бы воссоздать этот простой пример в Lua 5.2. Ниже моя попытка, но она не работает, как в примере выше.

--# 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)

Выполнение этого примера показывает вывод:

upvalue    table: 0x637e90
_ENV       table: 0x6305f0
1          nil



Мне известны некоторые другие вопросы по этому вопросу, но в основном они, похоже, имеют дело с загрузкой динамического кода (файлов или строк), которые довольно хорошо работают с использованием новогоload функция предусмотрена в Lua 5.2. Здесь я специально спрашиваю решение для запуска произвольных функций в песочнице. Я хотел бы сделать это без использованияdebug библиотека. По словам Луадокументация мы не должны полагаться на это.

Ответы на вопрос(4)

Ваш ответ на вопрос