Menu
Coddy logo textTech

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}
challenge icon

Sfida

Medio

Sono 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:

  1. eseguendo merge dei due hash con un blocco, così che le quantità delle chiavi presenti in entrambi vengano sommate (non sovrascritte)
  2. applicando transform_keys(&:to_sym) al risultato, così che le chiavi diventino simboli
  3. applicando transform_values per 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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Ruby online