Создание глубокой копии _ENV и изменение значений без изменения оригиналов - PullRequest
2 голосов
/ 26 апреля 2019

Я работаю над кодом Lua, где он может вызывать функции песочницы в качестве пользовательской среды.Мне нужно создать копию _ENV, изменить в ней функции и запустить функцию, используя новую среду.Пока у меня есть это:

new_env = _ENV

function newIoOpen(f,m)
  print("Function is opening file "..f)
  return io.open(f,m)
end

new_env.io.open = newIoOpen

function testFunction()
  io.open("bar.txt","r") -- should print: "Function is opening file bar.txt"
end

io.open("foo.txt","r") -- should stay silent

setfenv(testFunction,new_env)
testFunction()

Вместо этого обычный вызов io.open печатает «Функция открывает файл foo.txt» и снова вызывает себя.То же самое с функцией io.open.Когда я заменяю функцию новой среды, она редактирует старую.Как я могу предотвратить это?

...