Menu
Coddy logo textTech

Hashes anidados

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 35 de 56.

Un valor de hash puede ser a su vez un hash. Esta estructura anidada es la forma en que el código Ruby suele representar registros estructurados: un solo hash cuyas claves son id (o nombre), donde cada valor contiene sus propios campos:

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

Para acceder a un valor anidado, encadena las búsquedas:

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

Agregar un campo nuevo a uno de los hashes internos funciona de la misma manera:

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

Para leer de forma segura un hash anidado al que podría faltarle una clave en cualquier nivel, dig recorre la cadena y devuelve nil si falta algo en el camino:

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

Desafío

Intermedio

Se proporciona un hash inventory anidado: cada clave de nivel superior es un departamento, cada clave interna es un artículo y cada valor interno es la cantidad almacenada (un entero).

Lee una línea de entrada: una lista de rutas de consulta department/item separadas por comas.

Para cada ruta, en orden, usa dig para resolverla. Imprime una de las siguientes opciones:

  • <department>/<item>: <qty> cuando la ruta existe
  • <department>/<item>: missing cuando dig devuelve nil

Después de imprimir cada línea, imprime también una línea de resumen:

Total inventory: <sum>

El total es la suma de cada cantidad de todos los departamentos del hash original. Usa iteración anidada (cada departamento y después cada artículo).

Para la entrada fruits/apples,meat/beef,fruits/dragonfruit,dairy/milk, la salida es:

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

Pruébalo tú mismo

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

# TODO: para cada lookup, dig e imprime qty o 'missing'.
#       Then print 'Total inventory: <sum>' across all items.
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de Ruby online