BT

Ruby 2.0: primeiro preview disponível e versão final em fevereiro/2013

por Mirko Stocker , traduzido por Walter Dias em 13 Nov 2012 |

Yusuke Endoh, gerente de lançamentos do Ruby 2.0, realizou uma série de anúncios recentes. Foi determinado o congelamento imediato de funcionalidades do Ruby 2.0.0, para o primeiro preview e foi estabelecida a data de lançamento final para 24 de fevereiro de 2013, coincidindo com o vigésimo aniversário do Ruby.

Um resumo das novas funcionalidades pode ser encontrado no arquivo NEWs do Ruby, e também na página de acompanhamento de pendências do projeto. Entre as principais mudanças, as mais impactantes são os keyword arguments e os refinements.

Argumentos de palavras chave

Ao invés de somente passar um hash para um método como argumento, o Ruby 2.0 inclui o suporte a keyword arguments ("argumentos de palavras chave"). Aqui está um exemplo extraído dos testes unitários do Ruby:

def f1(str: "foo", num: 424242)
 [str, num]
end

def test_f1
 assert_equal(["foo", 424242], f1)
 assert_equal(["bar", 424242], f1(str: "bar"))
 assert_equal(["foo", 111111], f1(num: 111111))
 assert_equal(["bar", 111111], f1(str: "bar", num: 111111))
 assert_raise(ArgumentError) { f1(str: "bar", check: true) }
 assert_raise(ArgumentError) { f1("string") }
end 

Note que esse código somente funciona para argumentos com valor default. Outros exemplos da nova sintaxe, e o seu funcionamento juntamente com argumentos tradicionais, podem ser encontrados nos testes unitários do Ruby.

Refinamentos

Os refinamentos (refinements) têm como objetivo tornar o monkey patching seguro, através da redução do escopo onde a modificação foi aplicada. No exemplo abaixo, proposto por Matz, o operador "/" é somente disponibilizado no Fixnums após o modulo MatnN ter sido incluído:

module MathN
 refine Fixnum do
   def /(other) quo(other) end
 end
end

class Foo
 using MathN
 def foo
   p 1 / 2
 end
end 

Yehuda Katz escreveu um post detalhado sobre como os refinamentos podem ser usados na prática. A nova funcionalidade está disponíveis atualmente no branch do Ruby 2.0, mas ainda pode ser removida da versão 2.0, devido a problemas de desempenho (veja a discussão original sobre essa funcionalidade).


O InfoQ ouviu Yusuke Endoh, para conhecer mais sobre o Ruby 2.0. Começamos perguntando sobre o que considera a principal mudança para os usuários.

Os refinamentos são a nova funcionalidade mais importante na linguagem. Eles trazem um novo conceito de modularidade para o Ruby. Muitos desenvolvedores poderão tirar vantagem da dos refinamentos para substituir a má prática do monkey patching. Note que a funcionalidade ainda está evoluindo; não está completamente "refinada" e irá melhorar conforme ganhamos mais maturidade com o uso. (Vamos respeitar a compatibilidade o máximo possível.)

Os argumentos de palavra-chave (keyword arguments) são a funcionalidade que chama mais atenção. Mas na verdade está longe de ser a maior mudança; é somente um açucar sintático. De uma perspectiva prática, porém, pode ser uma bela ajuda para tornar seu código mais limpo.

O enumerator#lazy é um sonho antigo dos programadores familiarizados com programação funcional. A funcionalidade fornece execução tardia para uma lista.

Já o Module#prepend pode ser a funcionalidade mais usada (implicitamente). Substitui o "method_alias_chain" do Rails através de um mecanismo muito mais elegante, utilizado módulos. A apresentação de Akira Matsuda na RubyConf mostra detalhes sobre essa funcionalidade.

Por fim, o desempenho foi muito melhorado, o que pode ser a a mudança mais relevante para quem não está interessado em novas funcionalidades.

InfoQ: Você poderia citar algumas possíveis incompatibilidades que usuários poderão encontrar?

Existem de fato algumas incompatibilidades. Pode-se encontrar todas elas no arquivos de novidades (NEWS). Por exemplo:

  • Object#respond_to? retorna falso por padrão para proteger os métodos.
  • Kernel#system e #exec não herdam mais file descriptors não padronizados.
  • Object#inspect não chama #to_s por padrão.

Planejamos fazer um guia oficial simples de atualização para a versão 2.0.0, levando em conta o feedback recebido com as versões preview e RC.


Com o objetivo de diminuir o consumo de memoria do Ruby, um novo coletor de lixo de marcação de bits (Bit Marking) será incluído na versão 2.0. Para saber mais sobre como funciona, consulte o excelente artigo sobre coleta de lixo de Pat Shaughnessy.

Aqui estão mais algumas funcionalidades que estarão presentes no Ruby 2.0:

A prévia do Ruby 2.0.0 está disponível para download em vários formatos.

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão
Comentários da comunidade

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber menssagens dessa discussão

Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2014 C4Media Inc.
Política de privacidade
BT