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] # BAgregar 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) # nilDesafío
IntermedioSe 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>: missingcuandodigdevuelvenil
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: 39Hoja 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] # 20Asigna 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) # nilPrué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.
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
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline