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 # 10Passo 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 } # 24Para 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(:*) # 24Uma vez que você consiga construir um acumulador personalizado, poderá computar quase qualquer coisa em uma única passagem.
Desafio
FácilLeia uma lista de inteiros separados por vírgula. Imprima três linhas:
- A soma (use
reduce(:+)) - O produto (use
reduce(:*)) - O máximo, computado com
reducee um bloco explícito, não usandomax.
Para a entrada 2,5,3,8, a saída é:
18
240
8Folha 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 } # 10Omita o valor inicial para usar o primeiro elemento como o acumulador inicial:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24Passe um símbolo como um atalho para operações simples:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24Experimente você mesmo
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: imprimir soma, produto e máximo (com reduce + bloco explícito)
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
1Strings a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um Intervalo?Métodos de IntervaloIntervalos em Case / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline