Menu
CoddyTech

Fonctions variadiques (...)

Fait partie de la section Logique et déroulement du programme du Journey Lua de Coddy. Leçon 11 sur 54.

Parfois, tu as besoin d’une fonction qui peut fonctionner avec un nombre quelconque d’arguments. Tu veux peut-être calculer la somme de deux nombres, ou de trois, ou de dix, sans écrire de fonctions distinctes pour chaque cas. Lua fournit une syntaxe spéciale pour cela : les trois points ...

Lorsque tu places ... dans la liste des paramètres d’une fonction, celle-ci devient une fonction variadique qui accepte un nombre quelconque d’arguments :

function sum(...)
    -- Corps de la fonction
end

Dans la fonction, tu peux accéder à ces arguments en utilisant à nouveau .... Pour les manipuler plus facilement, tu peux les regrouper dans une table à l’aide d’accolades :

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- Sortie : 30
print(sum(1, 2, 3, 4, 5))  -- Sortie : 15

L’expression {...} crée une table de type liste contenant tous les arguments transmis à la fonction. Tu peux ensuite parcourir cette table comme n’importe quelle autre, en utilisant l’opérateur de longueur # ou ipairs().

Cela fonctionne tant qu’aucun argument n’est nil. Un nil laisse un trou dans la table, et # n’est pas fiable avec une table contenant des trous. select("#", ...) renvoie toujours le nombre d’arguments, y compris ceux qui valent nil :

function countArgs(...)
    return select("#", ...)
end

print(countArgs(10, 20, 30))        -- Sortie : 3
print(countArgs(10, nil, 30, nil))  -- Sortie : 4
challenge icon

Défi

Facile

Écris une fonction calculateAverage qui accepte n’importe quel nombre d’arguments numériques et renvoie leur moyenne.

Utilise la syntaxe variadique ... pour accepter un nombre flexible d’arguments, les regrouper dans une table, calculer leur somme et la diviser par leur nombre.

Remarque : Le code de départ (marqué "Don't touch this code") lit des nombres depuis l’entrée, convertit chacun d’eux du texte en nombre à l’aide de tonumber(), puis les stocke dans une table appelée numbers. À la fin, il appelle ta fonction avec unpack(numbers), qui transmet les valeurs de la table comme arguments individuels ; ta fonction les reçoit donc sous la forme .... Tu n’as pas besoin de modifier ni de comprendre ce code en détail ; concentre-toi simplement sur l’écriture de calculateAverage.

Logique :

  • Regroupe tous les arguments dans une table à l’aide de {...}
  • Parcours la table pour calculer la somme de tous les nombres
  • Divise la somme par le nombre d’arguments pour obtenir la moyenne
  • Renvoie la moyenne sous forme de nombre

Paramètres :

  • ... (nombres) : nombre variable d’arguments numériques

Valeur renvoyée : La moyenne de tous les nombres fournis (nombre)

Essayez vous-même

-- Ne modifiez pas ce code --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- Écrivez le code ici
end
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et déroulement du programme

Entraînez-vous par vous-même : Compilateur Lua en ligne