Menu
Coddy logo textTech

Fonctions variadiques

Fait partie de la section Introduction à Luau du Journey Lua de Coddy — leçon 27 sur 73.

Vous avez utilisé les ... (varargs) de Lua pour écrire des fonctions qui acceptent un nombre quelconque d'arguments. Luau vous permet de typer les varargs, afin que chaque argument transmis soit vérifié :

function sum(...: number): number
    local total = 0
    for _, n in ipairs({...}) do
        total = total + n
    end
    return total
end

print(sum(1, 2))           -- 3
print(sum(1, 2, 3, 4, 5))  -- 15

...: number déclare que chaque argument supplémentaire doit être un nombre — sum(1, "two") devient une erreur de type. Les outils à l'exécution sont ceux que vous connaissez :

  • {...} rassemble les varargs dans un tableau (ici un {number})
  • select("#", ...) compte combien d'arguments sont arrivés
  • ... peut être transmis directement à une autre fonction, par ex. math.max(...)

Comme en Lua, ... doit être le dernier paramètre — les paramètres (typés) ordinaires viennent en premier, la partie variadique finale récupère le reste :

function joinWords(separator: string, ...: string): string
    return table.concat({...}, separator)
end

print(joinWords("-", "a", "b", "c"))  -- a-b-c
challenge icon

Défi

Facile

Créez une fonction nommée sumAll qui prend n'importe quel nombre d'arguments number (...: number) et renvoie leur somme sous forme de number.

Créez une fonction nommée countValues qui prend n'importe quel nombre d'arguments string et renvoie combien ont été transmis, sous forme de number — utilisez select("#", ...).

Créez une fonction nommée joinWords qui prend un separator: string requis suivi de n'importe quel nombre d'arguments string, et les renvoie joints avec le séparateur (utilisez table.concat sur {...}) — type de retour string.

Appelez et affichez avec print, chacun sur sa propre ligne :

  1. sumAll(5, 10, 15)
  2. sumAll(1, 2, 3, 4, 5)
  3. countValues("a", "b", "c", "d")
  4. joinWords("-", "apple", "banana", "cherry")
  5. joinWords(" | ", "red", "green", "blue")

Essayez vous-même

-- Écrivez le code ici
-- sumAll(...: number): number       -- boucler sur {...}
-- countValues(...: string): number  -- select("#", ...)
-- joinWords(separator: string, ...: string): string
-- puis afficher les cinq résultats
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 Introduction à Luau