Procs e Lambdas
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy. Lição 19 de 56.
Um bloco não é um objeto, você não pode armazená-lo em uma variável. Quando você quer um trecho de código que possa passar adiante, salvar e chamar mais tarde, você o envolve em um Proc ou uma lambda.
Um Proc é criado com Proc.new ou com a palavra-chave proc. Chame-o com .call:
double = proc { |n| n * 2 }
puts double.call(5) # 10
puts double.call(7) # 14Um lambda é semelhante, mas mais rígido, ele verifica se você passa o número correto de argumentos. A forma de seta -> é a grafia comum:
square = ->(n) { n * n }
puts square.call(4) # 16
puts square.(4) # 16 (atalho para .call)Ambos podem ser passados para um método que espera um bloco prefixando com &:
[1, 2, 3].map(&double) # [2, 4, 6]
[1, 2, 3].map(&square) # [1, 4, 9]Use uma lambda quando quiser uma verificação de argumentos mais rígida; use um Proc quando quiser um comportamento mais leve e tolerante.
Desafio
FácilCrie uma lambda chamada tripler que recebe um número e o retorna multiplicado por 3.
Em seguida, leia uma lista de números inteiros separados por vírgula e imprima, em linhas separadas:
- O resultado da chamada de
tripler.call(10) - Os números de entrada triplicados (use
map(&tripler)) e unidos com,
Para a entrada 1,2,3, a saída é:
30
3, 6, 9Experimente você mesmo
# TODO: defina `tripler` como uma lambda
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: linha 1, imprima tripler.call(10)
# TODO: linha 2, mapeie numbers com &tripler, junte com ", "
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 PipelinePratique por conta própria: Compilador de Ruby online