A palavra-chave yield
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 17 de 56.
Métodos que você mesmo define podem receber um bloco, assim como os métodos nativos. Dentro do método, a palavra-chave yield executa o bloco que o chamador passou.
def greet
puts "Before block"
yield
puts "After block"
end
greet do
puts "Hi from the block!"
end
# Before block
# Hi from the block!
# After blockVocê pode passar argumentos para o bloco passando-os para o yield:
def with_each(items)
items.each { |item| yield item }
end
with_each([10, 20, 30]) { |n| puts n }
# 10
# 20
# 30Se um método chama yield mas o chamador não passou um bloco, o Ruby gera um erro. block_given? permite que você verifique primeiro:
def maybe
yield if block_given?
end
maybe # nada acontece
maybe { puts "called!" } # chamado!Desafio
FácilDefina um método chamado repeat que recebe um argumento n (um número inteiro) e faz o yield dos valores 1, 2, ..., n para o seu bloco, um de cada vez.
Em seguida, chame seu método com n = 4 e um bloco que imprime "Got <value>" para cada valor retornado pelo yield.
A saída é:
Got 1
Got 2
Got 3
Got 4Folha de consulta
Use yield dentro de um método para executar o bloco passado pelo chamador:
def greet
yield
end
greet { puts "Hi!" } # Hi!Passe argumentos para o bloco via yield:
def with_each(items)
items.each { |item| yield item }
end
with_each([1, 2]) { |n| puts n }Use block_given? para verificar se um bloco foi fornecido antes de chamar yield:
def maybe
yield if block_given?
endExperimente você mesmo
# TODO: defina `repeat` que passa 1..n para o seu bloco
# TODO: chame repeat(4) com um bloco que imprime "Got <value>"
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