yield: rodando o bloco que um método recebeu

Prévia grátis 2 min de leitura

O que each, map e select estavam fazendo o tempo todo

Os três últimos cursos usaram each, map e select o tempo todo, métodos que recebem um bloco e o rodam. Nenhum mostrou como um método faz isso. A resposta é yield.

def greet
  puts "Before the block"
  yield
  puts "After the block"
end

greet { puts "Hello from the block!" }
# Before the block
# Hello from the block!
# After the block

yield, em qualquer ponto do corpo de um método, roda o bloco passado para esse método, ali mesmo. greet nunca dá nome ao bloco. O yield é o mecanismo inteiro: uma palavra-chave que quer dizer "rode o bloco agora".

Qualquer método que você define pode aceitar um bloco

Este curso se apoia numa ideia: each, map e select não são mágicos. São métodos comuns que rodam um bloco desse jeito, e qualquer método que você escreva pode fazer o mesmo.

O Ruby mostra onde um método mora. Method#source_location devolve onde um método foi definido, ou nil quando ele é implementado em C:

[].method(:each).source_location   # => nil, implementado em C
[].method(:map).source_location    # => nil, implementado em C
1.method(:times).source_location   # => ["<internal:numeric>", 255], escrito em Ruby

No interpretador padrão, each e map são escritos em C por velocidade. No Ruby 4.0, o times é escrito em Ruby, e dá para lê-lo. De todo modo, o mecanismo é o desta aula: receber um bloco e rodá-lo com yield. Nada disso é exclusivo de métodos nativos.

def twice
  yield
  yield
end

twice { puts "hi" }
# hi
# hi

twice chama yield duas vezes, então o bloco roda duas vezes. É assim que 3.times { ... } funciona: o times chama yield um número fixo de vezes seguidas.

Pontos-chave

  • yield roda o bloco passado ao método, no ponto em que está escrito.
  • Um método não precisa dar nome ao bloco para usar yield.
  • Chamar yield várias vezes roda o bloco várias vezes, que é como o times funciona.
  • each, map e select usam esse mesmo mecanismo; não são recursos especiais da linguagem.
Aula 1 de 7 · grátis

Continue com a aula 2

yield com argumentos

Passa valores ao bloco com yield, refaz o núcleo do each e usa o valor que o bloco devolve.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...