← Retour LearnBloxLearnBlox

Fonctions & Tables

Modules 5–6

Les fonctions te permettent de regrouper un bloc de code réutilisable : au lieu de réécrire la même logique dix fois, tu l'écris une fois et tu l'appelles. Les tables, elles, stockent des collections de données : une liste d'ennemis, un inventaire, les statistiques d'un joueur. Ensemble, elles forment l'ossature de tout jeu un peu sérieux.

En Luau, les tables servent à la fois d'arrays (listes ordonnées, parcourues avec ipairs) et de dictionnaires (paires clé-valeur, parcourues avec pairs). Comprendre quand utiliser l'un ou l'autre, et comment passer des données à une fonction via ses paramètres, débloque la quasi-totalité de la logique de gameplay.

🔧 Déclarer une fonction
-- Syntaxe classique
local function direBonjour(nom)
    print("Bonjour, " .. nom)
end

-- Syntaxe variable
local direBonjour = function(nom)
    print("Bonjour, " .. nom)
end

direBonjour("Roblox") -- appel
↩️ Valeur de retour
local function addition(a, b)
    return a + b
end

local resultat = addition(10, 5)
print(resultat) -- 15

-- Retours multiples
local function minMax(t)
    return math.min(table.unpack(t)),
           math.max(table.unpack(t))
end
local min, max = minMax({3,1,5,2})
📐 Scope — Portée des variables
local score = 100  -- portée : fichier

local function addPoints(n)
    local bonus = 10  -- portée : fonction
    score = score + n + bonus
end

-- ❌ bonus inaccessible ici
-- ✅ score accessible ici
💡 Toujours déclarer avec local — les globales "fuient" dans tous les scripts !
📋 Table — Array (liste)
local fruits = {"pomme", "banane", "kiwi"}

-- Index commence à 1 !
print(fruits[1]) -- "pomme"
print(#fruits)   -- 3 (longueur)

-- Ajouter / supprimer
table.insert(fruits, "mangue")   -- fin
table.insert(fruits, 2, "fraise") -- position 2
table.remove(fruits, 1)           -- retire index 1

-- Parcourir avec ipairs
for i, fruit in ipairs(fruits) do
    print(i, fruit)
end
🗂️ Table — Dictionnaire (clé/valeur)
local joueur = {
    nom   = "Alex",
    score = 250,
    actif = true
}

print(joueur.nom)       -- "Alex"
print(joueur["score"])  -- 250
joueur.score = 300     -- modifier
joueur.niveau = 5     -- ajouter
joueur.actif = nil    -- supprimer

-- Parcourir avec pairs
for cle, val in pairs(joueur) do
    print(cle, val)
end
🔗 Tables imbriquées
local equipe = {
    { nom = "Alex",  pts = 120 },
    { nom = "Maria", pts = 95  },
    { nom = "Tom",   pts = 200 },
}

print(equipe[1].nom) -- "Alex"
print(equipe[3].pts) -- 200

for _, p in ipairs(equipe) do
    print(p.nom .. ": " .. p.pts .. " pts")
end
🛠️ Fonctions utiles sur les tables
local scores = {42, 17, 99, 55}

table.sort(scores)                        -- tri croissant : {17, 42, 55, 99}
table.sort(scores, function(a,b) return a > b end)  -- décroissant
table.concat(scores, ", ")               -- "17, 42, 55, 99" (array de strings)

-- Copie superficielle (table.clone Luau)
local copie = table.clone(scores)

-- Vérifier si une valeur existe
local function contient(t, val)
    for _, v in ipairs(t) do
        if v == val then return true end
    end
    return false
end
✅ Bonnes pratiques & erreurs fréquentes
  • Une fonction = une responsabilité : si elle fait trop de choses, découpe-la. C'est plus facile à corriger et à réutiliser.
  • Les arrays Luau commencent à 1, pas à 0 — source d'erreurs fréquente si tu viens d'un autre langage.
  • ipairs pour les listes ordonnées, pairs pour les dictionnaires : ipairs s'arrête au premier trou dans les index.
  • Retourne une valeur avec return plutôt que de modifier une variable globale : ta fonction devient prévisible et testable.