Funcții, Închideri (Closures) și Argumente Variadice (…) în Lua în Lua

Ghid complet pentru funcții în Lua: funcții anonime, stocarea stării în închideri (closures), returnarea multiplă de valori și procesarea argumentelor variabile cu '...'.

Sintaxă
local function f(a, b, ...) return a + b, ... end

Funcțiile în Lua sunt valori de prim rang (First-Class Values). O funcție poate fi salvată într-o variabilă locală, pasată ca parametru către alte funcții sau returnată dintr-o funcție părinte. Atunci când o funcție internă accesează variabile locale din funcția exterioară (numite upvalues), ea formează o închidere lexicală (Closure).

Închideri lexicale și generatoare de contoare private
-- Generator de contoare cu stare privată încapsulată:
local function creeazaContor(valoareInitiala)
    local contor = valoareInitiala or 0 -- variabilă locală privată (upvalue)

    return function(pas)
        pas = pas or 1
        contor = contor + pas
        return contor
    end
end

local contorA = creeazaContor(10)
print(contorA())   -- 11
print(contorA(5))  -- 16

local contorB = creeazaContor(100)
print(contorB())   -- 101 (starea este complet independentă de contorA!)

-- Funcție cu număr variabil de parametri (Variadic function):
local function insumeaza(...)
    local total = 0
    -- Împachetăm argumentele într-un tabel sau iterăm prin select():
    for _, numar in ipairs({...}) do
        total = total + numar
    end
    return total
end

print("Suma numerelor este:", insumeaza(10, 20, 30, 40)) -- 100