Menu
Coddy logo textTech

Iterare sugli hash

Fa parte della sezione Logica e flusso del percorso Ruby di Coddy. Lezione 34 di 56.

Gli hash sono enumerabili, quindi puoi iterarli proprio come gli array. Esistono tre schemi comuni, a seconda di ciò che vuoi fare.

each ti fornisce sia la chiave che il valore:

prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
  puts "#{item}: $#{price}"
end

each_key scorre solo le chiavi:

prices.each_key { |k| puts k }   # mela, pane, latte

each_value scorre solo i valori:

prices.each_value { |v| puts v }   # 1, 3, 4

E tutti i metodi Enumerable che hai visto nel capitolo precedente, map, select, reduce: funzionano anche sugli hash. Ricevi semplicemente una coppia chiave/valore (o un array di 2 elementi) a ogni iterazione:

prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}
challenge icon

Sfida

Medio

Stai applicando uno sconto a un listino prezzi. È dato l'hash prices (simbolo dell'articolo => prezzo intero).

Leggi una riga di input: un elenco separato da virgole di articoli a cui applicare uno sconto del 50% (corrispondenti ai simboli nell'hash, in base al nome).

Stampa, in quest'ordine:

  1. Una riga per articolo nel formato <item>: $<final_price>, dove il prezzo finale è il valore scontato se l'articolo è nell'elenco degli sconti, o il valore originale altrimenti. Itera con each. Gli articoli mantengono l'ordine originale. Usa la divisione intera per lo sconto (price / 2).
  2. Was: $<n>: il totale originale (usa values.sum)
  3. Now: $<n>: il totale dopo lo sconto
  4. I nomi degli articoli il cui prezzo finale è ancora superiore a 2, uniti con , (usa select + keys sul nuovo hash)

Per l'input bread,milk con l'hash predefinito, l'output è:

apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheese

Provalo tu

prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)

# TODO: crea l'hash dei prezzi finali tramite each; stampa le righe, i totali e gli articoli costosi
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