Metatabele și Metametode în Lua: __index, __newindex și Supraîncărcare în Lua

Ghid complet pentru metatabele în Lua: metametodele __index, __newindex, __tostring, supraîncărcarea operatorilor aritmetici și protejarea tabelelor cu setmetatable.

Sintaxă
setmetatable(t, { __index = prototip, __tostring = functie })

Metatabelele reprezintă cel mai puternic mecanism de metaprogramare din Lua. O metatabelă este un tabel obișnuit asociat unui alt tabel pentru a-i modifica comportamentul la operațiuni cheie (accesare de proprietăți lipsă, adunare, conversie în text sau apel ca funcție) prin funcții speciale numite metametode (identificate prin prefixul __).

Definirea unui tip Vector2D cu adunare automată și conversie în șir
local Vector2D = {}
local mtVector = {}

-- Metametoda __add: supraîncarcă operatorul de adunare '+' :
mtVector.__add = function(v1, v2)
    return Vector2D.nou(v1.x + v2.x, v1.y + v2.y)
end

-- Metametoda __tostring: apelată automat de tostring() sau print():
mtVector.__tostring = function(v)
    return string.format("Vector2D(x=%.2f, y=%.2f)", v.x, v.y)
end

function Vector2D.nou(x, y)
    local instanta = { x = x or 0, y = y or 0 }
    setmetatable(instanta, mtVector)
    return instanta
end

local v1 = Vector2D.nou(10, 20)
local v2 = Vector2D.nou(5, 15)
local vRezultat = v1 + v2 -- declanșează mtVector.__add

print(vRezultat) -- declanșează mtVector.__tostring -> "Vector2D(x=15.00, y=35.00)"
Metametodă Când este invocată Utilizare tipică
__index Când se încearcă citirea unei chei inexistente (t[cheie]). Moștenire și apel de metode în programarea pe obiecte.
__newindex Când se atribuie o valoare unei chei noi (t[cheie] = val). Tabele read-only, validare de proprietăți și observatori de date.
__tostring Când tabelul este transformat în text prin print() sau tostring(). Formatare lizibilă pentru diagnostic și depanare.
__call Când tabelul este apelat ca o funcție (t(...)). Construirea de obiecte funcționale (functors).
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Metatabele și Metametode în Lua: __index, __newindex și Supraîncărcare

Ai o nelămurire despre utilizarea comenzii Metatabele și Metametode în Lua: __index, __newindex și Supraîncărcare 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.