IT Mídia
Notícias em destaque

Procs e lambdas em Ruby

24 de julho de 2011 18:36

Blocos não são objetos e não podem ser manipulados como objetos em Ruby. Procs e lambdas tornam possível criar um objeto que represente um bloco.

Apesar de ambos serem instâncias da classe Proc, o comportamento dos procs é muito parecido com blocos e o comportamento dos lambdas é parecido com métodos.

Vamos ver como criá-los e utilizá-los.

Procs

A maneira “normal” de se criar um proc é através do construtor da classe Proc. Chamando o método new, passando um bloco associado, será retornado um proc que representa o bloco.

Outra forma de se criar um proc é recebendo um bloco como parâmetro de um método. Para fazer isso é que o nome do parâmetro que vai receber o bloco seja prefixado com “&” (ampersand ou ê comercial).

Lambdas

O jeito mais comum de se criar um lambda é através do método lambda, que pertence ao módulo Kernel e por isso se comporta com um método global.

Na versão 1.8 do Ruby, o método global proc é um álias (sinônimo) para o método lambda. Já no Ruby 1.9, o método proc passou a ser um álias para Proc.new, retornando assim um proc e não mais um lambda como na versão 1.8.

A versão 1.9 do Ruby traz uma nova sintaxe para se criar lambdas. O que antes poderia somente ser declarado assim:

Agora pode ser feito assim:

Uma vantagem desse novo tipo de declaração do lambda no Ruby 1.9 é a possibilidade de informar valores padrão para os parâmetros:

Da mesma forma que nas chamdas de métodos, os parênteses podem ser omitidos:

Invocando procs e lambdas

Mesmo que procs e lambdas tenham um código de bloco associado, eles não podem ser executados diretamente como fazemos com métodos. Procs e lambdas são objetos e não métodos, então é possível chamar um método do objeto.

Para executar um proc/lambda temos o método call da classe Proc:

O método call executa o código do bloco original que foi passado na criação do proc/lambda. Os parâmetros passados para o método call são repassados para o bloco original e o retorno do bloco será retornado pelo método call.

Outra maneira de invocar um proc/lambda é através de um array que recebe os parâmetros como seus elementos:

Na minha opinião isso é meio que uma gambiarra do Ruby para ter uma sintaxe parecida com uma chamada de método, “trocando” os parênteses por colchetes.

No Ruby 1.9 foi criada uma sintaxe adicional para invocar um proc/lambda:

.() é uma Syntatic Sugar que invoca o método call.

No próximo post veremos as diferenças entre procs e lambdas.

Referências:

TAGS: ruby

Sobre Fernando Hamasaki de Amorim

Desenvolvedor sênior na Locaweb, Fernando Hamasaki de Amorim atua em projetos utilizando Ruby e Rails. Pós-graduado em Tecnologias Web Fiap, trabalha desde 2000 com desenvolvimento web, onde já desenvolveu em várias plataformas e linguagens, como .NET, Java, JavaScript, PHP e ASP. Também foi palestrante do FISL e da RubyConf Brasil. Neste espaço, abordará temas envolvendo o desenvolvimento por meio da linguagem Ruby.

Entre em contato com Fernando Hamasaki de Amorim

Parceiros

Portais: IT Mídia | IT Web | Saúde Web

Publicações: InformationWeek Brasil | CRN Brasil | FH

Fóruns: IT Forum | IT Forum + | IT Business Forum | Saúde Business Forum