Menu
Coddy logo textTech

Hash annidati

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

Un valore hash può essere a sua volta un hash. Questa struttura annidata è il modo in cui il codice Ruby rappresenta tipicamente i record strutturati: un singolo hash con chiavi costituite da ID (o nomi), in cui ogni valore contiene i propri campi:

students = {
  "Alice" => { age: 20, grade: "A" },
  "Bob"   => { age: 22, grade: "B" }
}

Per raggiungere un valore annidato, concatena le ricerche:

puts students["Alice"][:age]    # 20
puts students["Bob"][:grade]    # B

Aggiungere un nuovo campo a uno degli hash interni funziona allo stesso modo:

students["Alice"][:major] = "Math"
puts students["Alice"]
# {age: 20, grade: "A", major: "Math"}

Per leggere in modo sicuro da un hash annidato in cui potrebbe mancare una chiave a qualsiasi livello, dig percorre la catena e restituisce nil se manca qualcosa lungo il percorso:

students.dig("Alice", :grade)   # "A"
students.dig("Cara",  :grade)   # nil
challenge icon

Sfida

Medio

È fornito un hash annidato inventory: ogni chiave di primo livello è un reparto, ogni chiave interna è un articolo e ogni valore interno è la quantità disponibile (un intero).

Leggi una riga di input: un elenco separato da virgole di percorsi di ricerca department/item.

Per ogni percorso, nell’ordine, usa dig per risolverlo. Stampa:

  • <department>/<item>: <qty> quando il percorso esiste
  • <department>/<item>: missing quando dig restituisce nil

Dopo aver stampato ogni riga, stampa anche una riga riepilogativa:

Total inventory: <sum>

Il totale è la somma di ogni quantità in tutti i reparti dell’hash originale. Usa un’iterazione annidata (ogni reparto, poi ogni articolo).

Per l’input fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk, l’output è:

fruits/apples: 12
meat/beef: 7
fruits/dragonfruit: missing
dairy/milk: 9
Total inventory: 39

Provalo tu

inventory = {
  fruits: { apples: 12, bananas: 4 },
  meat:   { beef: 7, chicken: 5 },
  dairy:  { milk: 9, cheese: 2 }
}
lookups = gets.chomp.split(",")

# TODO: per ogni lookup, usa dig e stampa qty oppure 'missing'.
#       Poi stampa 'Total inventory: <sum>' per tutti gli elementi.
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