yield: rodando o bloco que um método recebeu
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
yieldroda 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
yieldvárias vezes roda o bloco várias vezes, que é como otimesfunciona. each,mapeselectusam esse mesmo mecanismo; não são recursos especiais da linguagem.
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.