Reduce / Inject
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 23 de 56.
A veces necesitas reducir un array completo a un solo valor, una suma, un producto, la cadena más larga. reduce (también llamado inject: el mismo método, dos nombres) es la herramienta.
El bloque recibe dos parámetros: el acumulador y el elemento actual. El valor de retorno del bloque se convierte en el siguiente acumulador.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10Paso a paso, el acumulador es 0 → 1 → 3 → 6 → 10.
El primer argumento es el valor inicial del acumulador. Si lo omites, Ruby utiliza el primer elemento del arreglo:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Para operaciones puras como la suma y el producto, Ruby te ofrece un atajo: pasa un símbolo en lugar de un bloque:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Una vez que puedas construir un acumulador personalizado, puedes calcular casi cualquier cosa en una sola pasada.
Desafío
FácilLee una lista de enteros separados por comas. Imprime tres líneas:
- La suma (usa
reduce(:+)) - El producto (usa
reduce(:*)) - El máximo, calculado con
reducey un bloque explícito, no usandomax.
Para la entrada 2,5,3,8, la salida es:
18
240
8Hoja de referencia
reduce (alias: inject) reduce un array a un solo valor. El bloque recibe un acumulador y el elemento actual; su valor de retorno se convierte en el siguiente acumulador.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n } # 10Omite el valor inicial para usar el primer elemento como el acumulador inicial:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Pasa un símbolo como atajo para operaciones simples:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Pruébalo tú mismo
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: imprimir suma, producto y máximo (con reduce + bloque explícito)
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