Combinación y transformación
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 36 de 56.
Dos operaciones surgen con tanta frecuencia al trabajar con hashes que Ruby les otorga sus propios métodos.
merge combina dos hashes en uno nuevo. Cuando ambos tienen la misma clave, el valor de la derecha prevalece:
defaults = { color: "red", size: "M" }
custom = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect # {color: "red", size: "L"}Ninguno de los originales se modifica, merge devuelve un nuevo hash.
transform_values construye un nuevo hash con las mismas claves pero con cada valor pasado a través de un bloque:
prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect # {apple: 1.2, bread: 3.6}Y transform_keys hace lo mismo para las claves, lo cual es útil al convertir cadenas a símbolos o al normalizar el uso de mayúsculas y minúsculas:
{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}Desafío
IntermedioSe proporcionan dos hashes de carrito: monday y tuesday; cada uno asigna un nombre de artículo de tipo string a una cantidad entera. La tienda quiere un total normalizado de dos días.
Produce un hash final mediante:
- aplicar
mergea los dos hashes con un bloque, de modo que las claves presentes en ambos tengan sus cantidades sumadas (no sobrescritas) - aplicar
transform_keys(&:to_sym)al resultado, para que las claves se conviertan en símbolos - aplicar
transform_valuespara aplicar un descuento por volumen del 10 %: cada cantidad se convierte en(qty * 9 / 10)usando aritmética entera
Imprime el hash final con inspect.
Para los datos predeterminados, la salida es:
{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}(Manzanas: 5 + 5 = 10, después 9. Pan: 3 + 2 = 5, después 4. Leche: 6 solo el lunes → 5. Queso: 2 solo el martes → 1.)
Pruébalo tú mismo
monday = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }
# TODO: merge-with-block para sumar claves superpuestas, luego simbolizar claves,
# luego aplicar * 9 / 10 a cada valor, luego inspeccionar
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