O Ruby 1.9 está ai e já passou da hora de começarmos a ver quais são algumas das novidades mais importantes desta nova versão da nossa linguagem de programação preferida.
À partir da versão 1.9 argumentos criados dentro de blocos terão seu escopo limitado ao mesmo. Para entender melhor, vejamos um exemplo de código executado na versão 1.8.6 e logo em seguida na versão 1.9:
i = "Olá"
3.times {|i| puts i }
puts i
# 0
# 1
# 2
# 2
Note que no código acima ao alterar a variável i dentro do bloco (o método times atribui um novo valor a cada execução) acabamos também alterando a variável com o mesmo nome que foi declarada fora do bloco. Embora isto não seja um bug, mas sim uma característica do Ruby nesta versão, raramente (talvez nunca) vamos desejar este comportamento.
Agora o mesmo código sendo executado na versão 1.9:
i = "Olá"
3.times {|i| puts i }
puts i
# 0
# 1
# 2
# "Olá"
Desta vez a execução do bloco não alterou a variável externa i. Toda variável criada dentro de um bloco no Ruby 1.9 só existirá dentro do escopo do bloco, por isto cuidado com seus códigos malucos ao migrar para esta nova versão!
Muito bom isso. Pra mim parece mais lógico.
Carlos,
Você podia dar sua opinião sobre as novidades. Eu sei que isso pode gerar flamewares e discussões sem sentido, mas é muito mais interessante ver um ponto de vista sobre algo novo.
Abraço
Carlos, fiquei com uma dúvida. São só as variáveis declaradas dentro do bloco (entre pipes) que serão consideradas locais? Por exemplo:
x = 10 3.times {|i| x = 11} puts x #x é 10 ou 11?Eu acho isso estranho se partirmos da idéia anterior que os blocos como closures carregam o escopo de onde foram chamados e por isso alteravam os valores das variaveis que estavam definidas foram do bloco, mas acho que isso só vai trazer vantagem.
Fernando,
Exatamente. Somente as variáveis entre pipes ‘|’ tem este comportamento. No seu exemplo ele retornaria 11.
Veja o código abaixo e mais um exemplo:
x = "Olá" 3.times do |y| x = y end puts x # => 2A politica de escopo do Ruby sempre foi ….. estranha.
Pena terem começado à arrumar isso só depois que tanto código já tenha sido escrito. Estas alterações na linguagem são o tipo da coisa que geram muitos problemas.