Rails Girl – Rails for Newbies

Ruby on Rails for Newbies

O que eu aprendi (ou não!) sobre Closures em Ruby agosto 12, 2008

Filed under: Ruby — amandavarella @ 12:07 am
Tags:

Hoje eu li o livro Learn to Program. Bem interessante pra quem não sabe nada de programação, ou para uma noção inicial sobre Ruby. Tudo corre bem, até o capítulo 10, cujos conceitos podem ser complicados até pro experiente. Eu confesso que quando li o capítulo 10, me senti um pouco como há cerca de 9 anos atrás, quando eu comecei a programar. Mas que assunto bizarro é esse? São as Closures (tb conhecidas como fechamento)! Eu já tinha ouvido falar, mas estou indo aos poucos, e aprendendo conceito a conceito, sem embolar o meio de campo. A idéia das Closures é simples: Um bloco de código, pode ser armazenado em uma variável e executado! Acredite, com esta abordagem é possível construir os códigos mais exóticos possíveis! Segundo o Chris Pine, autor do livro Learn to Program ele não consegue mais viver sem elas! Vou colocar uns exemplos do livro Learn Program para dar uma pequena demonstração:

saudacao = Proc.new do
  puts 'Olá!'
end

saudacao.call

Neste trecho de código você cria a instância “saudacao” da classe “Proc”, que servirá para você armazenar o código do seu procedimento. Depois você manda executar a “saudacao”. Neste caso, a saída do programa será “Olá!”

Como instâncias de Proc se comportam como quaisquer outras instâncias de variáveis, você também poderá retornar um Procedimento (isto mesmo, fiquei chocada! Retornar um procedimento ao invés de um valor!) um outro pequeno exemplo de retorno do livro (esse mais complexo):

def compor proc1, proc2
  Proc.new do |x|
    proc2.call(proc1.call(x))
  end
end

quadrado = Proc.new do |x|
  x * x
end

dobre = Proc.new do |x|
  x + x
end

dobreeEleve = compor dobre, quadrado
puts dobreeEleve.call(5)

Resultado

100

Nossa…compor recebe dois procedimentos como parâmetro, e retorna um terceiro procedimento como resultado da operação de proc1 e proc2. Ainda vou processar isto durante a noite! Realmente, pra quem nunca trabalhou com linguagens dinâmicas é um conceito bem diferente.
Eu não tenho a mínima pretensão de explicar tudo sobre Closures aqui (até mesmo pq eu não entendi tudo ainda!). Na verdade não sei se precisarei algum dia, acho que precisar não precisa, mas para determinadas coisas deve facilitar. Talvez quando estiver pensando “ruby” eu já tenha a sacada de como utilizar. A única mensagem que eu gostaria de deixar pros Newbies é que este é um conceito difícil sim, e no começo do aprendizado você pode perfeitamente conviver sem ele, considero que é um plus, um brinde da linguagem, de qualquer maneira é sempre bom saber como funciona, no caso de precisarmos ler o código alheio. As explicações profundas eu deixo pros profissionais:

http://sproutcorewithrails.org/2007/11/30/anatomia-de-ruby-blocks-closures

http://aprendaaprogramar.rubyonrails.pro.br/capitulo10