Blocks e yield no Ruby com exemplos de uso
Os blocos em Ruby são uma forma poderosa e flexível de passar um conjunto de instruções para um método. Eles são usados para executar código dentro do contexto de um método, permitindo que você personalize a execução desse método. Vamos explorar isso com exemplos e detalhes.
O que são Blocos?
Um bloco em Ruby é basicamente um pedaço de código que você pode passar para um método. Ele é definido entre do...end
ou chaves {...}
. Blocos são usados frequentemente com métodos iteradores, como each
, map
, etc.
Exemplos Práticos
- Iterando com Blocos:
[1, 2, 3].each do |number|
puts number * 2
end
Neste exemplo, o bloco é passado para o método each
. O bloco recebe cada elemento do array e executa o código dentro dele (puts number * 2
).
- Usando Blocos com
{}
:
[1, 2, 3].each { |number| puts number * 2 }
Este é o mesmo exemplo anterior, mas usando chaves em vez de do...end
. Geralmente, chaves são usadas para blocos de uma única linha.
Uso do yield
yield
é uma palavra-chave em Ruby que é usada dentro de um método para chamar um bloco passado para esse método.
- Método com
yield
:
def print_twice
yield
yield
end
print_twice { puts "Hello!" }
Aqui, o método print_twice
chama o bloco duas vezes. Cada vez que yield
é chamado, o bloco { puts "Hello!" }
é executado.
- Passando Parâmetros para Blocos via
yield
:
def greet
yield "Hello"
yield "Goodbye"
end
greet { |msg| puts "#{msg}, world!" }
Neste exemplo, o método greet
passa diferentes strings para o bloco usando yield
.
Em que Contexto Usar yield
yield
é útil quando você quer:
- Permitir que os usuários de seu método forneçam código adicional que será executado dentro do método.
- Executar um bloco de código várias vezes dentro de um método.
- Passar diferentes parâmetros para um bloco em diferentes momentos da execução do método.
Técnicas e Dicas
- Blocos e Encerramento (Closure): Blocos em Ruby são closures. Eles podem usar e modificar variáveis locais que estão no escopo onde o bloco foi definido.
- Verificando a Presença de um Bloco: Você pode verificar se um bloco foi passado com o método
block_given?
. - Blocos e Procs: Em Ruby, blocos podem ser convertidos em objetos
Proc
, permitindo que sejam armazenados em variáveis e passados como argumentos.
Referências
Blocos são uma parte fundamental da programação Ruby e são usados em muitos métodos internos e bibliotecas. Entender como eles funcionam e como usá-los é essencial para escrever código Ruby idiomático e eficiente.