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
endDans 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 : 15L’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 : 4Dé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
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
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() contre ipairs()Récapitulatif - Fiche de personnage2Fonctions supplémentaires de la bibliothèque table
table.concat()construction de tables et unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des meilleurs scores3Concepts avancés des fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu’est-ce qu’une fermeture ?Récapitulatif - Gestionnaire d’événements simpleEntraînez-vous par vous-même : Compilateur Lua en ligne