Fonctions variadiques (...)
Fait partie de la section Logique et flux du Journey Lua de Coddy. Leçon 11 sur 54.
Parfois, vous avez besoin d'une fonction capable de travailler avec n'importe quel nombre d'arguments. Peut-être voulez-vous calculer la somme de deux nombres, ou trois, ou dix — sans écrire de fonctions distinctes pour chaque cas. Lua propose une syntaxe spéciale pour cela : les trois points ...
Lorsque vous placez ... dans la liste des paramètres d'une fonction, elle devient une fonction variadique qui accepte n'importe quel nombre d'arguments :
function sum(...)
-- Corps de la fonction
endÀ l'intérieur de la fonction, vous pouvez accéder à ces arguments en utilisant à nouveau .... Pour travailler avec eux plus facilement, vous pouvez les regrouper dans une table en utilisant des 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)) -- Résultat : 30
print(sum(1, 2, 3, 4, 5)) -- Résultat : 15L'expression {...} crée une table de type liste contenant tous les arguments passés à la fonction. Vous pouvez ensuite parcourir cette table comme n'importe quelle autre, en utilisant l'opérateur de longueur # ou ipairs().
Défi
FacileÉcrivez une fonction calculateAverage qui accepte n'importe quel nombre d'arguments numériques et retourne leur moyenne.
Utilisez la syntaxe variadique ... pour accepter un nombre flexible d'arguments, emballez-les dans une table, calculez leur somme et divisez par le nombre d'éléments.
Note : Le code de départ (marqué "Don't touch this code") lit des nombres à partir de l'entrée, convertit chacun d'eux du texte en nombre à l'aide de tonumber(), et les stocke dans une table nommée numbers. À la fin, il appelle votre fonction en utilisant unpack(numbers), ce qui déploie les valeurs de la table comme des arguments individuels — ainsi votre fonction les reçoit sous la forme .... Vous n'avez pas besoin de modifier ou de comprendre ce code en détail ; concentrez-vous simplement sur l'écriture de calculateAverage.
Logique :
- Emballez tous les arguments dans une table en utilisant
{...} - Parcourez la table pour calculer la somme de tous les nombres
- Divisez la somme par le nombre d'arguments pour obtenir la moyenne
- Retournez la moyenne sous forme de nombre
Paramètres :
...(nombres) : Nombre variable d'arguments numériques
Retourne : La moyenne de tous les nombres fournis (nombre)
Essayez vous-même
-- Ne pas toucher à 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(...)
-- Écrire le code ici
end
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
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 flux
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simpleEntraînez-vous par vous-même : Compilateur Lua en ligne