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, empresa na qual está desde 2007, Fernando Hamasaki de Amorim trabalha desde a criação até a arquitetura, modelagem, análise e integração de sistemas e aplicativos na companhia. Graduado em Tecnologia em Informática pela UniSant'Anna, o profissional possui pós-graduação em Tecnologias Web com Ênfase em Java pela Fiap. Já atuou em diversas outras companhias, tais como a TV Online, empresa brasileira pioneira em transmissões ao vivo e SAC Sistemas, que desenvolve ERP. 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