Menu
Coddy logo textTech

Reduce / Inject

Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 23 de 56.

Às vezes você precisa reduzir um array inteiro a um único valor, uma soma, um produto, uma string mais longa. reduce (também chamado de inject: mesmo método, dois nomes) é a ferramenta.

O bloco recebe dois parâmetros: o acumulador e o elemento atual. O valor de retorno do bloco torna-se o próximo acumulador.

total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total   # 10

Passo a passo, o acumulador é 0 → 1 → 3 → 6 → 10.

O primeiro argumento é o valor inicial do acumulador. Se você o omitir, o Ruby usará o primeiro elemento do array:

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

Para operações puras como soma e produto, o Ruby oferece um atalho: passe um símbolo em vez de um bloco:

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

Uma vez que você consiga construir um acumulador personalizado, poderá computar quase qualquer coisa em uma única passagem.

challenge icon

Desafio

Fácil

Leia uma lista de inteiros separados por vírgula. Imprima três linhas:

  1. A soma (use reduce(:+))
  2. O produto (use reduce(:*))
  3. O máximo, computado com reduce e um bloco explícito, não usando max.

Para a entrada 2,5,3,8, a saída é:

18
240
8

Folha de consulta

reduce (alias: inject) reduz um array a um único valor. O bloco recebe um acumulador e o elemento atual; seu valor de retorno torna-se o próximo acumulador.

total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }  # 10

Omita o valor inicial para usar o primeiro elemento como o acumulador inicial:

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

Passe um símbolo como um atalho para operações simples:

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

Experimente você mesmo

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

# TODO: imprimir soma, produto e máximo (com reduce + bloco explícito)
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Lógica e Fluxo