Я учусь на «Программировании на Lua» Роберто Иерусалимского и обнаружил, что в книге пример «Песочницы» использует функцию setfenv()
для изменения среды данной функции, но в lua 5.2 эта функция больше недоступна..
Я попытался загрузить некоторые значения из файла (файла конфигурации )в поле таблицы, но в lua 5.2 я не могу использовать setfenv (, поэтому я могу загрузить значения в данной среде ). Прочитав некоторые статьи о lua 5.2, я обнаружил, что каждая функция может иметь (или не )повышающее значение, называемое _ENV, которое служит средой, поэтому я попробовал следующий код:
function sandbox(sb_func, sb_env)
if not sb_func then return nil, "sandbox function not valid" end
sb_orig_env = _ENV
_ENV = sb_env -- yes, replaces the global _ENV
pcall_res, message = pcall( sb_func )
local modified_env = _ENV -- gets the environment that was used in the pcall( sb_func )
_ENV = sb_orig_env
return true, modified_env
end
function readFile(filename)
code = loadfile(filename)
res, table = sandbox(code, {})
if res then
--[[ Use table (modified_env) ]]--
else
print("Code not valid")
end
Замена _ENV
в функции «песочницы» работает хорошо (не может получить доступ к обычным полям ), но при выполнении «кода» кажется, что он игнорирует то, что я заменил _ENV
, он все еще может доступ к обычным полям (print, loadfile, dofile и т. д. ).
Прочитав немного больше, я обнаружил, что lua 5.2 предоставляет функцию для этой цели, эта функция loadin(env, chunk)
, которая запускает данный фрагмент в данной среде, но, когда я пытаюсь добавить эту функцию в свой код,функция не существует (Отсутствует в глобальном _G
поле ).
Некоторая помощь будет оценена по достоинству.