Execuție Dinamică și Medii Izolate în Lua: load, loadfile, dofile și variabila _ENV în Lua

Ghid complet pentru compilarea și rularea dinamică a codului în Lua 5.4: utilizarea load, încărcarea fișierelor cu loadfile și sandbox-area codului prin variabila de mediu _ENV.

Sintaxă
local chunk = load("return 2 + 2"); chunk(); _ENV = sandbox

Lua include propriul său compilator la runtime. Funcția load compilează un șir de caractere sau o funcție într-un bloc executabil (chunk), oferind posibilități imense de metaprogramare, generare de cod la rulare și crearea de medii de rulare izolate (sandbox).

Compilarea și rularea unui șir de cod cu load
local codText = "local a, b = ...; return a * b + 10"

-- load(chunk, chunkname, mode, env)
-- Mode poate fi "t" (doar text), "b" (doar bytecode binar), sau "bt" (ambele)
local functieCompilata, err = load(codText, "calculator_dinamic", "t")

if not functieCompilata then
    print("Eroare de sintaxă la compilare:", err)
else
    -- Apelarea funcției compilate transmițând parametri (vararg '...'):
    local rezultat = functieCompilata(5, 4)
    print("Rezultatul calculului dinamic:", rezultat) -- 5 * 4 + 10 = 30
end
Crearea unui mediu izolat de securitate (Sandbox) cu _ENV
-- În Lua 5.4, toate variabilele globale trăiesc în tabela _ENV
-- Putem restricționa ce funcții are voie să acceseze un cod nesigur:

local mediuSigur = {
    print = print,
    math = { max = math.max, min = math.min, pi = math.pi }
    -- Nu includem os, io, debug, package etc.
}

local codNesigur = [[
    print("Calcul permis:", math.max(10, 25))
    -- Următoarea linie ar încerca să șteargă fișiere:
    if os then os.execute("rm -rf /") end
]]

-- Compilăm codul specificând mediuSigur drept al 4-lea parametru (_ENV):
local fnIzolata = load(codNesigur, "sandbox_chunk", "t", mediuSigur)
fnIzolata() -- Rulează în siguranță; 'os' este nil!
Funcție Semnătură Comportament
load(chunk, [name], [mode], [env]) Șir sau funcție iterator Compilează codul fără a-l executa. Returnează funcția compilată sau nil, eroare.
loadfile(filename, [mode], [env]) Calea către fișier Citește și compilează fișierul de pe disc fără a-l executa.
dofile(filename) Calea către fișier Citește, compilează și execută imediat fișierul în mediul global curent.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Execuție Dinamică și Medii Izolate în Lua: load, loadfile, dofile și variabila _ENV

Ai o nelămurire despre utilizarea comenzii Execuție Dinamică și Medii Izolate în Lua: load, loadfile, dofile și variabila _ENV sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.