Peczenyj's Blog

Just Another /Perl|Ruby|C++|Java|Python|JavaScript|Flash|Bash/ Hacker

Closures Em Shell

Uma das coisas mais impressionantes (pelo menos para mim) da linguagem Ruby são os Closures:

$ ruby -e 'r=0...3 ; r.each { puts "oi"}
oi
oi
oi


em um objeto do tipo Range eu tenho um método chamado each que recebe um bloco de código como argumento. Este bloco pode até ser parametrizado, por exemplo:

$ ruby -e 'r=0...3 ; r.each { |i| puts 2*i}'
0
2
4


O que o metodo each faz é passar este bloco de código para ‘dentro de si’ e aplica-o em cada elemento do objeto ‘range’. Pode ser para imprimir o resultado ou efetuar uma operação matemática, até mesmo substituindo um laço for simples. A verdade é que os Closures são bem mais do que isso e permitem fazer scripts bem interessantes.

Sera que poderiamos ter o mesmo em BashScript ? Bem… vou simular aqui

$ each(){ 
local F="${@}"
while read i ; do
set - $i
eval "${F}"
done
}

$ seq 3 | each '{ echo "encontrei $1" ; }'
encontrei 1
encontrei 2
encontrei 3


Simples heim? Eu crio uma variavel local dentro de uma função e ‘executo-a’ para cada resultado via comando eval. Se este tipo de construção for util para alguem, fica aí a dica!