Procs em Ruby
Blocos não são objetos, mas eles podem ser convertidos em objetos da classe Proc. Podemos fazer isso chamando o método lambda, presente no módulo Kernel do Ruby. Um bloco criado com lambda atua como um método Ruby. Caso você não especifique o número correto de argumentos, você não pode chamar o bloco.
1 prc = lambda {"hello"}
Objetos Proc são blocos de código que são vinculados a um grupo de variáveis locais. A classe Proc tem uma chamada de método que invoca o bloco. O programa p024proccall.rb ilustra isso.
1 # Blocos não são objetos 2 # eles podem ser convertidos em objetos da classe Proc, 3 # chamando o método lambda 4 prc = lambda {puts 'Olá'} 5 # o método call chama o bloco 6 prc.call 7 8 # outro exemplo 9 brinde = lambda do 10 puts 'Viva' 11 end 12 brinde.call
A saída deste código é:
1 >ruby p024proccall.rb 2 Olá 3 Viva 4 >Exit code: 0
Se você chamar o método class do objeto prc, você verá que ele pertence a classe Proc, como podemos ver no exemplo abaixo:
1 prc = lambda {puts 'Hello'} 2 puts prc.class 3 #a saída será Proc
Lembre-se que você não pode passar métodos dentro de outros métodos (mas você pode passar procs dentro dos métodos), e métodos não podem retornar outros métodos (mas eles podem retornar procs).
O próximo exemplo mostra como os métodos podem usar procs. Exemplo p025mtdproc.rb
1 =begin 2 Você não pode passar métodos dentro de outros métodos 3 (mas pode passar procs dentro dos métodos), 4 e métodos não podem retornar outros métodos (mas eles podem retornar procs) 5 =end 6 7 def algum_metodo algum_proc 8 puts 'Início do método' 9 algum_proc.call 10 puts 'Fim do método' 11 end 12 13 fale = lambda do 14 puts 'Olá' 15 end 16 17 algum_metodo fale
A saída do exemplo será:
1 >ruby p025mtdproc.rb 2 Início do método 3 Olá 4 Fim do método 5 >Exit code: 0
Aqui está outro exemplo da passagem de argumentos usando lambda.
1 umBloco = lambda { |x| puts x } 2 umBloco.call 'Olá Mundo!' 3 # a saída será: Olá Mundo!
Fabio Akita, grande entusiasta do Rails e Ruby, também conhecido online como “AkitaOnRails”, escreveu um excelente artigo sobre Closures/Blocos em Ruby para os membros do rubylearning.com, que também foi publicado em português no seu blog. Se você quiser saber mais sobre blocos em Ruby, esse artigo poderá te ajudar em muito.
Outro artigo recomendado é o do Daniel Lopes, que explica de uma forma bem didática o conceito e uso de blocos.
Este material tem como base o tutorial do RubyLearning.com de Satish Talim e foi traduzido por membros do GURU-SP com a permissão do autor.
Ajude o RubyLearning participando em algum dos cursos pagos ou fazendo uma doação para o projeto