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 hash puede ser en sí mismo un hash. Esta forma anidada es como el código Ruby representa típicamente registros estructurados, un único hash indexado por id (o nombre), donde cada valor lleva 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 nuevo campo 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 de un hash anidado al que le podría faltar 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 en stock (un entero).

Lee una línea de entrada: una lista separada por comas de rutas de búsqueda department/item.

Para cada ruta, en orden, utiliza dig para resolverla. Imprime ya sea:

  • <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 en todos los departamentos del hash original. Utiliza iteración anidada (cada departamento, luego 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

Hoja de referencia

Los hashes anidados almacenan hashes como valores dentro de otro hash:

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

Encadena las búsquedas para acceder a los valores anidados:

students["Alice"][:age]    # 20

Asigna para añadir o actualizar un campo anidado:

students["Alice"][:major] = "Math"

Usa dig para recorrer de forma segura las claves anidadas; devuelve nil si falta alguna clave:

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

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 búsqueda, profundizar e imprimir la cantidad o 'missing'.
#       Luego imprimir 'Total inventory: <sum>' de todos los artículos.
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