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] # BAgregar 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) # 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 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>: 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 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: 39Prué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.
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
1Cadenas en profundidad
Descripción general de los métodos de cadenasInterpolación de cadenasIteración sobre cadenasSeparar y unirRepaso: Tejedor de cadenas4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end frente a llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasRepaso: iterador personalizado7Hashes Parte 2
Hash.new con valores predeterminadosIteración de hashesHashes anidadosCombinación y transformaciónRepaso: contador de frecuencias10Proyecto - Registros de estudiantes
Descripción general del proyectoAgregar estudiante5Potencia Enumerable
Select y RejectEncadenamiento de MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byRepaso: canalización de datosPractica por tu cuenta: Compilador de Ruby online