Procs e Lambdas em Ruby um pouco da abordagem funcional
No Ruby, tanto Procs quanto Lambdas são objetos que encapsulam blocos de código, que podem ser armazenados em variáveis e passados como argumentos para métodos. Eles são úteis para estratégias de programação como callbacks e funções de ordem superior. Vamos explorar cada um deles e depois analisar o código que você forneceu.
Procs
Um Proc
(abreviação de procedure) é um bloco de código que foi encapsulado em um objeto. Procs são flexíveis: eles não se importam com o número correto de argumentos. Se você passar menos argumentos do que o esperado, os argumentos faltantes serão definidos como nil
. Se você passar mais, os argumentos extras serão ignorados.
Lambdas
Lambdas são similares aos Procs, mas com algumas diferenças-chave:
- Verificação de Argumentos: Lambdas verificam o número de argumentos passados para eles e lançarão um erro se o número não corresponder ao esperado.
- Retorno de um Lambda: Quando você usa a palavra-chave
return
dentro de um lambda, ela retorna apenas do lambda. Em um Proc,return
retornará do escopo em que o Proc foi definido.
Seu Código Explicado
def exemplo_proc(&bloco)
bloco.call
end
meu_proc = Proc.new { puts "Isso é um Proc!" }
exemplo_proc(&meu_proc)
Quando visualizar um código em ruby com: &:id => converte um symbol para Proc object. ou metodo(¶metro) => recebe um valor de bloco de código e converte para Proc.
Neste código:
- Definição do Método
exemplo_proc
: Este método aceita um bloco como argumento. O&
na frente dobloco
na definição do método é um operador que converte o bloco passado para o método em um objetoProc
. - Criação de um Proc:
meu_proc
é um objetoProc
criado comProc.new
. Dentro das chaves{}
está o bloco de código que oProc
encapsula. - Chamada do Método com um Proc: Quando
exemplo_proc(&meu_proc)
é chamado, o&meu_proc
converte oProc
de volta em um bloco e passa para o métodoexemplo_proc
. Dentro do método,bloco.call
é chamado, executando o código dentro doProc
.
Portanto, quando você executa este código, a saída será "Isso é um Proc!", que é o que está definido dentro do bloco do Proc
.