O que haverá de novo no Ruby 2.5?
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:
ruby
# Arquivo `teste.rb`
def a
b
end
def b
c
end
def c
raise 'error'
end
a
Executando com Ruby 2.4:
bash
$ 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:
bash
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:ruby
begin
raise 'boom'
rescue Exception => e
puts "Erro capturado: #{e.message}"
end
Saída:
Erro capturado: boom
.ruby
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:
ruby
[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:
ruby
objeto.tap { |obj| obj.save } # => objeto
# O método `save` foi chamado,
# mas `objeto` é que é retornado
ruby
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!