Size: a a a

2020 May 31

S

Snusmumriken in pro.lua
Alexander Berezin
всё всё работает, разобрался 👍 спасибо

А в чём отличие _ENV от _G ? Может их оба затирать на всякий случай?
_ENV — это текущее окружение (_G по дефолту, но можно пересадить).
источник

S

Snusmumriken in pro.lua
_G — глобальное окружение. Без всяких upvalue и локальных контекстов. Там расположена стандартная либа, и туда пишутся переменные.
источник

CP

Companion Philipp in pro.lua
Snusmumriken
_ENV — это текущее окружение (_G по дефолту, но можно пересадить).
А по-моему нет
источник

CP

Companion Philipp in pro.lua
По-моему _ENV че-то другое
источник

S

Snusmumriken in pro.lua
Я ща чекну.
источник

S

Snusmumriken in pro.lua
Companion Philipp
По-моему _ENV че-то другое
Да, ты прав, _ENV это таки текущая таблица _G. По умолчанию как раз _G и есть.

Её можно переключить на другую таблицу (setenv?)
источник

CP

Companion Philipp in pro.lua
Карочи, тема, которой я тоже ни разу не пользовался, спасибо Luajit’у за это
источник

AB

Alexander Berezin in pro.lua
их обе затирать лучше?
источник

S

Snusmumriken in pro.lua
Нет
источник

S

Snusmumriken in pro.lua
Если не менял _ENV — это одна и та же таблица что и _G.
источник

CP

Companion Philipp in pro.lua
Snusmumriken
Да, ты прав, _ENV это таки текущая таблица _G. По умолчанию как раз _G и есть.

Её можно переключить на другую таблицу (setenv?)
setenv это вроде как тема 5.1, в 5.2 её можно вроде просто пересоздать
источник

S

Snusmumriken in pro.lua
Вот щас гуглю
источник

S

Snusmumriken in pro.lua
Да, мы такие:

print(_ENV == _G) -- prints true, since the default _ENV is set to the global table

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

http://lua-users.org/wiki/EnvironmentsTutorial
источник

AB

Alexander Berezin in pro.lua
внутри _ENV у меня _G сидит, это норма? 🤔
источник

S

Snusmumriken in pro.lua
Да, потому что это _G и есть. Внутри _G есть _G, иначе бы ты не получил доступ к _G ))
источник

AB

Alexander Berezin in pro.lua
аааа
источник

AB

Alexander Berezin in pro.lua
а, ну понятно теперь, почему при затирании _G оно бьёт ошибку, т.к. он _G затирает и не может больше его затирать 😅
ок всем спасибо
источник

S

Snusmumriken in pro.lua
Карочи, что ты такой делаешь.

1. Создаёшь табличку и пихаешь туда всё разрешённое:
local userenv = {
 print = print,
 table = {
   concat = table.concat,
   insert = table.insert,
   ...
 },
 string = string
 os = { -- допустим, разрешаем часть os-либы
   time = os.time,
 },
 ...
}
-- делаем похожим на _G
userenv._G = userenv

2. Потом делаешь особое пространство, в котором будет пользовательский код:

do -- скоуп для юзерспейса
 local _ENV = userenv -- переключаешь _ENV для этого скоупа
 loadstring(usercode)() -- исполняем код
end
-- на этой точке _G уже обратно то _G которое было ранее. Все пользовательские объявления глобалов и переопределения не играют роли, ибо остались в userenv.
источник

AB

Alexander Berezin in pro.lua
кстати, _G = {} и _ENV = {} не работает
источник

CP

Companion Philipp in pro.lua
(я пошел спать, короче, я совсем ересь писать начинаю)
источник