Menu
Coddy logo textTech

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 block

Você 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
# 30

Se 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!
challenge icon

Desafio

Fácil

Defina 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 4

Folha 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?
end

Experimente você mesmo

# TODO: defina `repeat` que passa 1..n para o seu bloco

# TODO: chame repeat(4) com um bloco que imprime "Got <value>"
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