Proc e Lambda
Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 19 di 56.
Un blocco non è un oggetto: non puoi memorizzarlo in una variabile. Quando vuoi un pezzo di codice che puoi passare, salvare e chiamare in seguito, lo racchiudi in una Proc o in una lambda.
Una Proc viene creata con Proc.new o con la parola chiave proc. Chiamala con .call:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Una lambda è simile, ma più rigorosa: verifica che tu passi il numero corretto di argomenti. La forma con la freccia -> è la sintassi più comune:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (forma abbreviata di .call)Entrambi possono essere passati a un metodo che si aspetta un blocco anteponendo &:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Usa una lambda quando vuoi un controllo degli argomenti più rigoroso; usa un Proc quando vuoi un comportamento più leggero e permissivo.
Sfida
FacileCrea una lambda chiamata tripler che accetta un numero e lo restituisce moltiplicato per 3.
Poi leggi un elenco di numeri interi separati da virgole e stampa, su righe separate:
- Il risultato della chiamata a
tripler.call(10) - I numeri di input triplicati (usa
map(&tripler)) e uniti con,
Per l'input 1,2,3, l'output è:
30
3, 6, 9Provalo tu
# TODO: definisci `tripler` come una lambda
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: riga 1, stampa tripler.call(10)
# TODO: riga 2, applica map a numbers con &tripler, poi unisci con ", "
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