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). |
Întrebări & Exemple de Cod:
Metatabele și Metametode în Lua: __index, __newindex și SupraîncărcareAi o nelămurire despre utilizarea comenzii
Metatabele și Metametode în Lua: __index, __newindex și Supraîncărcaresau 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.