Iteración de hashes
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 34 de 56.
Los hashes son enumerables, así que puedes iterar sobre ellos igual que sobre los arrays. Hay tres patrones comunes, según lo que quieras.
each te proporciona tanto la clave como el valor:
prices = { apple: 1, bread: 3, milk: 4 }
prices.each do |item, price|
puts "#{item}: $#{price}"
endeach_key recorre solo las claves:
prices.each_key { |k| puts k } # apple, bread, milkeach_value recorre solo los valores:
prices.each_value { |v| puts v } # 1, 3, 4Y todos los métodos de Enumerable que viste en el capítulo anterior, map, select, reduce: también funcionan con hashes. Simplemente recibes un par clave/valor (o un array de 2 elementos) en cada iteración:
prices.select { |item, price| price > 2 }
# {bread: 3, milk: 4}Desafío
IntermedioEstás aplicando una oferta a una lista de precios. Se proporciona el hash prices (símbolo del artículo => entero del precio).
Lee una línea de entrada: una lista separada por comas de artículos a los que aplicar un descuento del 50 % (que coincidan por nombre con los símbolos del hash).
Imprime, en este orden:
- Una línea por artículo con el formato
<item>: $<final_price>, donde el precio final es el valor con descuento cuando el artículo está en la lista de descuentos, o el valor original en caso contrario. Itera coneach. Los artículos conservan su orden original. Usa división entera para el descuento (price / 2). Was: $<n>: el total original (usavalues.sum)Now: $<n>: el total después del descuento- Los nombres de los artículos cuyo precio final todavía sea superior a
2, unidos con,(usaselect+keysen el nuevo hash)
Para la entrada bread,milk con el hash predeterminado, la salida es:
apple: $1
bread: $1
milk: $2
cheese: $6
Was: $14
Now: $10
cheesePruébalo tú mismo
prices = { apple: 1, bread: 3, milk: 4, cheese: 6 }
discount = gets.chomp.split(",").map(&:to_sym)
# TODO: construye el hash de precio-final mediante each; imprime líneas, totales, artículos caros
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