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. |
Întrebări & Exemple de Cod:
Execuție Dinamică și Medii Izolate în Lua: load, loadfile, dofile și variabila _ENVAi o nelămurire despre utilizarea comenzii
Execuție Dinamică și Medii Izolate în Lua: load, loadfile, dofile și variabila _ENVsau 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.