O que haverá de novo no Ruby 2.5?

ruby

A versão 2.5.0-preview1 da linguagem Ruby acaba de ser liberada. Por não se tratar de uma versão estável, seu uso ainda não é recomendado.

Novas funcionalidades

Backtrace invertido

O backtrace (lista de métodos que foram executados antes de um erro acontecer) vai começar a ser exibida em ordem inversa. Usando o seguinte código como exemplo:

# Arquivo `teste.rb`

def a
  b
end

def b
  c
end

def c
  raise 'error'
end

a

Executando com Ruby 2.4:

$ ruby teste.rb
teste.rb:10:in `c': error (RuntimeError)
    from teste.rb:6:in `b'
    from teste.rb:2:in `a'
    from teste.rb:13:in `<main>'

Executando com Ruby 2.5:

Traceback (most recent call last):
    3: from teste.rb:13:in `<main>'
    2: from teste.rb:2:in `a'
    1: from teste.rb:6:in `b'

Rescue/else/ensure serão permitidos dentro de blocos do/end

Executando com Ruby 2.4:

Atualmente nós só conseguimos capturar exceptions dentro de métodos ou blocos begin/end, ou seja:

begin
  raise 'boom'
rescue Exception => e
  puts "Erro capturado: #{e.message}"
end

Saída: Erro capturado: boom.

def meu_metodo
  raise 'boom'
rescue Exception => e
  puts "Erro capturado: #{e.message}"
end

meu_metodo

Saída: Erro capturado: boom.

Porém o código abaixo não funciona:

[1, 2, 3].map do |i|
  raise 'boom'
rescue Exception => e
  puts "Erro capturado: #{e.message}"
end
syntax error, unexpected keyword_rescue, expecting keyword_end
rescue Exception => e

Executando com Ruby 2.5:

Na versão que está para ser lançada, isso é possível. A saída do código acima será:

Erro capturado: boom
Erro capturado: boom
Erro capturado: boom

Novo método yield_self

De acordo com a documentação oficial:

Yields self to the block and returns the result of the block.

Apesar de ser muito parecido com o método tap da classe Object (que é muito útil, diga-se de passagem), seus retornos são diferentes.

Enquanto que com o método tap você abre um bloco e no final o próprio objeto é retornado, com o yield_self, o resultado do bloco é retornado.

Exemplo:

objeto.tap { |obj| obj.save } # => objeto
# O método `save` foi chamado,
# mas `objeto` é que é retornado
objeto.yield_self { |obj| obj.save } # => true
# A última execução do bloco será retornada.
# Ou seja, se supormos que o método `save` retorna `true`,
# o retorno dessa linha toda será `true` também

Não consegui pensar em um caso prático pra usá-lo, mas com certeza teve uma razão para ter sido adicionado :)

Outras mudanças

A nova versão também trará outras novidades, como suporte ao Unicode versão 10, que inclui 56 emojis criados esse ano. Você pode ver uma lista completa com todas as novidades nesse documento.


Para instalar o Ruby 2.5 (apesar de ainda não recomendado por não ser uma versão estável) através do RVM, basta rodar:

rvm install 2.5.0-preview1

Happy hacking!

Deixe um comentário