Model _ENV w Lua 5.2+
Proszę zrozumieć, jak _ENV zastąpiło setfenv i umożliwia kontrolowanie środowiska.
Model _ENV w Lua 5.2+ to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Czym jest _ENV?
W Lua 5.2+ każdy fragment kodu ma niejawną zmienną upvalue o nazwie _ENV. Wszystkie odwołania do zmiennych globalnych są przepisywane na odwołania do pól tabeli _ENV. Zatem print(x) staje się _ENV.print(_ENV.x).
_ENV zastępuje setfenv
W Lua 5.1 funkcja setfenv(fn, env) zmieniała środowisko globalne funkcji. W wersji 5.2+ została usunięta. Zamiast tego należy ustawić _ENV jako zmienną lokalną, aby zmienić środowisko fragmentu kodu lub bloku.
Zmiana _ENV we fragmencie kodu
Ustawienie _ENV na początku fragmentu kodu przekierowuje wszystkie odwołania do zmiennych globalnych.
-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello") -- calls myEnv.print("hello")Lokalny _ENV dla bloku
Zmianę _ENV należy ograniczyć do bloku do...end, aby ograniczyć jej wpływ.
do
local _ENV = {print = print, x = 42}
print(x) -- 42 from local _ENV
end
print(x) -- original _ENV.x (global x)Używanie load z _ENV
load(chunk, chunkname, mode, env) wykonuje ciąg znaków jako fragment kodu w niestandardowym środowisku. Jest to podstawowy mechanizm piaskownicy w wersji 5.2+.
local env = {print = print, math = math}
local fn, err = load("print(math.sqrt(16))", "sandbox", "t", env)
if fn then fn() end -- 4.0Odczytywanie bieżącego _ENV
Zmienne globalne bieżącego fragmentu kodu znajdują się w _ENV. Aby uzyskać odwołanie, należy użyć: local myEnv = _ENV.
Modyfikowanie _ENV w czasie działania
Ustawienie zmiennej globalnej ma postać _ENV.varName = value. Ponieważ _ENV jest zmienną upvalue, można w dowolnym momencie wykonania kodu zamienić ją na inną tabelę.
Dziedziczenie za pomocą __index
Środowisku piaskownicy należy nadać metatabelę z wartością __index = _G, aby funkcje, których jawnie nie zablokowano, korzystały z prawdziwej tabeli globalnej.
local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nilWykrywanie prób dostępu do _ENV
Niebezpieczne zmienne globalne należy zastąpić wartością sygnalizacyjną, która rejestruje próby dostępu na potrzeby audytu bezpieczeństwa.
sandboxEnv.os = setmetatable({}, {
__index = function(_, k)
ngx.log(ngx.WARN, "Blocked access: os." .. k)
return nil
end
})Uwaga dotycząca zgodności
Biblioteki korzystające z setfenv/getfenv z Lua 5.1 wymagają przepisania na potrzeby wersji 5.2+. Niektóre używają warstwy zgodności w kodzie inicjalizacyjnym.
Znaczenie praktyczne
Model _ENV sprawia, że tworzenie piaskownicy jest prostsze i bardziej spójne. Zamiast dwóch mechanizmów — setfenv dla funkcji i zmiennych globalnych dla kodu najwyższego poziomu — istnieje jeden jasno określony mechanizm obsługi środowisk.
Pytanie dotyczące _ENV
W jaki sposób Lua 5.2+ przepisuje odwołanie do zmiennej globalnej print(x)?
Podsumowanie: model _ENV
Lua 5.2+ kieruje wszystkie odwołania do zmiennych globalnych przez zmienną upvalue _ENV. Za pomocą load(code, name, "t", env) można wykonywać kod w niestandardowym środowisku. Jest to standardowy mechanizm tworzenia piaskownicy, który zastępuje setfenv.
Często zadawane pytania
Czy lekcja „Model _ENV w Lua 5.2+” jest bezpłatna?
Tak — pełny tekst „Model _ENV w Lua 5.2+” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Model _ENV w Lua 5.2+”?
Proszę zrozumieć, jak _ENV zastąpiło setfenv i umożliwia kontrolowanie środowiska. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Model _ENV w Lua 5.2+”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Model _ENV w Lua 5.2+
- Tworzenie ograniczonego sandboxa
- Zapobieganie ucieczkom z sandboxa
- Limity zasobów i instrumentacja