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:
- DTrace probes, para analisar o desempenho de aplicações em execução.
- Biblioteca Regex Onigmo melhorada, com suporte às novas funcionalidades introduzidas pelo Perl 5.10.
- Transplante de métodos, permitindo mover métodos de um módulo para outros módulos ou classes.
- Suporte a HTML5 no CGI.
A prévia do Ruby 2.0.0 está disponível para download em vários formatos.