Воссоздание 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
библиотека. По словам Луадокументация мы не должны полагаться на это.