Menu
Coddy logo textTech

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   # 10

Paso 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 }   # 24

Para 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(:*)   # 24

Una vez que puedas construir un acumulador personalizado, puedes calcular casi cualquier cosa en una sola pasada.

challenge icon

Desafío

Fácil

Lee una lista de enteros separados por comas. Imprime tres líneas:

  1. La suma (usa reduce(:+))
  2. El producto (usa reduce(:*))
  3. El máximo, calculado con reduce y un bloque explícito, no usando max.

Para la entrada 2,5,3,8, la salida es:

18
240
8

Hoja 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 }  # 10

Omite el valor inicial para usar el primer elemento como el acumulador inicial:

[1, 2, 3, 4].reduce { |acc, n| acc * n }  # 24

Pasa un símbolo como atajo para operaciones simples:

[1, 2, 3, 4].reduce(:+)  # 10
[1, 2, 3, 4].reduce(:*)  # 24

Pruébalo tú mismo

numbers = gets.chomp.split(",").map(&:to_i)

# TODO: imprimir suma, producto y máximo (con reduce + bloque explícito)
quiz iconPonte a prueba

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