Funzioni variadiche (...)
Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 11 di 54.
A volte hai bisogno di una funzione che possa funzionare con un numero qualsiasi di argomenti. Magari vuoi calcolare la somma di due numeri, o tre, o dieci, senza scrivere funzioni separate per ogni caso. Lua fornisce una sintassi speciale per questo: i tre puntini ...
Quando inserisci ... nell'elenco dei parametri di una funzione, questa diventa una funzione variadica che accetta un numero qualsiasi di argomenti:
function sum(...)
-- Corpo della funzione
endAll'interno della funzione, puoi accedere a questi argomenti usando di nuovo .... Per lavorarci più facilmente, puoi inserirli in una tabella usando le parentesi graffe:
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)) -- Output: 30
print(sum(1, 2, 3, 4, 5)) -- Output: 15L’espressione {...} crea una tabella in stile lista contenente tutti gli argomenti passati alla funzione. Puoi quindi scorrere questa tabella proprio come qualsiasi altra, usando l’operatore di lunghezza # o ipairs().
Sfida
FacileScrivi una funzione calculateAverage che accetti un numero qualsiasi di argomenti numerici e ne restituisca la media.
Usa la sintassi variadica ... per accettare un numero flessibile di argomenti, inserirli in una tabella, calcolarne la somma e dividerla per il conteggio.
Nota: Il codice iniziale (contrassegnato da "Don't touch this code") legge i numeri dall'input, converte ciascuno da testo a numero usando tonumber() e li memorizza in una tabella chiamata numbers. Alla fine, chiama la tua funzione usando unpack(numbers), che passa i valori della tabella come argomenti individuali, così la tua funzione li riceve come .... Non devi modificare né comprendere nel dettaglio questo codice; concentrati solo sulla scrittura di calculateAverage.
Logica:
- Inserisci tutti gli argomenti in una tabella usando
{...} - Itera attraverso la tabella per calcolare la somma di tutti i numeri
- Dividi la somma per il numero di argomenti per ottenere la media
- Restituisci la media come numero
Parametri:
...(numeri): numero variabile di argomenti numerici
Restituisce: La media di tutti i numeri forniti (numero)
Provalo tu
-- Non modificare questo codice --
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(...)
-- Scrivi il codice qui
end
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Iterazione avanzata delle tabelle
Iterare con pairs()Iterare con ipairs()pairs() vs. ipairs()Riepilogo - Scheda del personaggio2Altre funzioni della libreria table
table.concat()Costruzione di tabelle e unpack()table.sort()Ordinamento personalizzato con funzioniRiepilogo - Tabellone dei punteggi più alti3Concetti avanzati sulle funzioni
Restituire più valoriFunzioni variadiche (...)Funzioni come valori di prima classeFunzioni anonimeChe cos'è una closure?Riepilogo - Gestore di eventi sempliceEsercitati da solo: Compilatore Lua online