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.

Avalie esse artigo

Relevância
Estilo/Redação

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 mensagens dessa discussão
Comentários da comunidade

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

Receber mensagens dessa discussão

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

Receber mensagens dessa discussão

Dê sua opinião
Feedback geral
Bugs
Publicidade
Editorial
Marketing
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2016 C4Media Inc.
Política de privacidade
BT

We notice you’re using an ad blocker

We understand why you use ad blockers. However to keep InfoQ free we need your support. InfoQ will not provide your data to third parties without individual opt-in consent. We only work with advertisers relevant to our readers. Please consider whitelisting us.