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!
Nenhum comentário:
Postar um comentário