Fonctions variadiques (...)
Fait partie de la section Logic & Flow 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)
Aide-mémoire
Lua prend en charge les fonctions variadiques qui peuvent accepter n'importe quel nombre d'arguments en utilisant la syntaxe des trois points ... :
function sum(...)
-- Corps de la fonction
endÀ l'intérieur d'une fonction variadique, regroupez les arguments dans une table en utilisant {...} :
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 : 15L'expression {...} crée une table contenant tous les arguments. Vous pouvez la parcourir en utilisant l'opérateur de longueur # ou ipairs().
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 Logic & Flow
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 simple