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


Olha, eu fiz quase todo a aprenda a programar, e realmente eu não entendi esse cap. 10.
Obs.: eu nunca programei em nenhuma linguagem, então não se espera muito de mim mesmo, estou no 1 semestre de Sistema, então algum dia vou intender isso ai, hehehe
Muito bom o artigo.
abs – Rafael
Acho interessante o recurso de closures, porém, acho que quando usado em demasia o código fica um bocado sujo.