Reduce / Inject
Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 23 di 56.
A volte devi ridurre un intero array a un singolo valore: una somma, un prodotto, la stringa più lunga. reduce (chiamato anche inject: stesso metodo, due nomi) è lo strumento giusto.
Il blocco accetta due parametri: l'accumulatore e l'elemento corrente. Il valore restituito dal blocco diventa l'accumulatore successivo.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10Passo dopo passo, l'accumulatore è 0 → 1 → 3 → 6 → 10.
Il primo argomento è il valore iniziale dell’accumulatore. Se lo ometti, Ruby usa il primo elemento dell’array:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Per operazioni semplici come la somma e il prodotto, Ruby ti offre una scorciatoia: passa un simbolo invece di un blocco:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Una volta che sai creare un accumulatore personalizzato, puoi calcolare quasi tutto in un solo passaggio.
Sfida
FacileLeggi un elenco di numeri interi separati da virgole. Stampa tre righe:
- La somma (usa
reduce(:+)) - Il prodotto (usa
reduce(:*)) - Il massimo, calcolato con
reducee un blocco esplicito, non usandomax.
Per l'input 2,5,3,8, l'output è:
18
240
8Provalo tu
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: stampa la somma, il prodotto e il massimo (con reduce + un blocco esplicito)
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Panoramica dei metodi delle stringheInterpolazione di stringheIterare sulle stringheDividere e unireRiepilogo - Tessitore di stringhe4Blocchi, Proc e Lambda
Che cos’è un Block?do..end vs parentesi graffeLa keyword yieldParametri del BlockProc e LambdaRiepilogo - Iteratore personalizzato7Hash in Ruby - Parte 2
Hash.new con valori predefinitiIterare sugli hashHash annidatiUnire e trasformareRipasso - Contatore di frequenza10Progetto - Registri degli studenti
Panoramica del progettoAggiungere uno studente2Intervalli
Che cos'è un intervallo?Metodi degli intervalliIntervalli in Case / WhenRiepilogo - Esercitarsi con gli intervalli5La potenza di Enumerable
Select e RejectConcatenare MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRiepilogo - Pipeline di datiEsercitati da solo: Compilatore Ruby online