Unire e trasformare
Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 36 di 56.
Due operazioni ricorrono così spesso quando si lavora con gli hash che Ruby fornisce loro metodi dedicati.
merge combina due hash in uno nuovo. Quando entrambi hanno la stessa chiave, prevale il valore a destra:
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}Nessuno dei due originali viene modificato, merge restituisce un nuovo hash.
transform_values crea un nuovo hash con le stesse chiavi, ma ogni valore viene passato attraverso un blocco:
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}E transform_keys fa lo stesso per le chiavi, utile quando si convertono stringhe in simboli o si normalizza la distinzione tra maiuscole e minuscole:
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}Sfida
MedioSono dati due hash del carrello: monday e tuesday, ciascuno associa il nome di un articolo come stringa a una quantità intera. Il negozio vuole un totale normalizzato su due giorni.
Produci un unico hash finale:
- eseguendo
mergedei due hash con un blocco, così che le quantità delle chiavi presenti in entrambi vengano sommate (non sovrascritte) - applicando
transform_keys(&:to_sym)al risultato, così che le chiavi diventino simboli - applicando
transform_valuesper applicare uno sconto del 10% sugli acquisti all’ingrosso: ogni quantità diventa(qty * 9 / 10)usando l’aritmetica intera
Stampa l’hash finale con inspect.
Con i dati predefiniti, l’output è:
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(Mele: 5 + 5 = 10, poi 9. Pane: 3 + 2 = 5, poi 4. Latte: 6 solo lunedì → 5. Formaggio: 2 solo martedì → 1.)
Provalo tu
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO: unisci con un blocco per sommare i valori delle chiavi comuni, poi converti le chiavi in simboli,
# poi applica * 9 / 10 a ogni valore, quindi esamina il risultato
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