S
А в чём отличие _ENV от _G ? Может их оба затирать на всякий случай?
_G
по дефолту, но можно пересадить).Size: a a a
S
_G
по дефолту, но можно пересадить).S
CP
_G
по дефолту, но можно пересадить).CP
S
S
_ENV
это таки текущая таблица _G
. По умолчанию как раз _G
и есть.CP
AB
S
S
_ENV
— это одна и та же таблица что и _G
.CP
_ENV
это таки текущая таблица _G
. По умолчанию как раз _G
и есть.S
S
print(_ENV == _G) -- prints true, since the default _ENV is set to the global tablehttp://lua-users.org/wiki/EnvironmentsTutorial
a = 1
local function f(t)
local print = print -- since we will change the environment, standard functions will not be visible
local _ENV = t -- change the environment. without the local, this would change the environment for the entire chunk
print(getmetatable) -- prints nil, since global variables (including the standard functions) are not in the new env
a = 2 -- create a new entry in t, doesn't touch the original "a" global
b = 3 -- create a new entry in t
end
local t = {}
f(t)
print(a, b) --> 1 nil
print(t.a, t.b) --> 2 3
AB
S
_G
и есть. Внутри _G
есть _G
, иначе бы ты не получил доступ к _G
))AB
AB
S
local userenv = {
print = print,
table = {
concat = table.concat,
insert = table.insert,
...
},
string = string
os = { -- допустим, разрешаем часть os-либы
time = os.time,
},
...
}2. Потом делаешь особое пространство, в котором будет пользовательский код:
-- делаем похожим на _G
userenv._G = userenv
do -- скоуп для юзерспейса
local _ENV = userenv -- переключаешь _ENV для этого скоупа
loadstring(usercode)() -- исполняем код
end
-- на этой точке _G уже обратно то _G которое было ранее. Все пользовательские объявления глобалов и переопределения не играют роли, ибо остались в userenv.
AB
_G = {}
и _ENV = {}
не работаетCP