Conheça algumas novidades do Ruby 2.5!

O Ruby 2.5 foi oficialmente lançado no dia 25 de dezembro de 2017 ( nada mal, papai noel! 😀 ) e com isso vieram novidades. Vamos conhecer algumas delas?

Antes de mais nada, o link oficial da release de lançamento é: https://www.ruby-lang.org/en/news/2017/12/25/ruby-2-5-0-released/ .

Pois bem. Além das novidades, que mostrarei logo mais, você pode verificar muitas outras que vieram junto a essa nova versão.

A primeira podemos ver no próprio post do release de lançamento:

"rescue/else/ensure are allowed inside do/end blocks without begin/end"

Ou seja, no rescue/else/ensure agora são permitidos, dentro de blocos, o do/endsem o begin/end. Vejamos um exemplo…

O código abaixo é válido para Ruby ≤ 2.4

# Para Ruby <= 2.4
class XYZ
3.times.each do |i|
begin
puts i
raise “erro”
rescue
puts “Recuperando-se do erro!”
end
end
end
=> 0
=> Recuperando-se do erro!
=> 1
=> Recuperando-se do erro!
=> 2
=> Recuperando-se do erro!

Como pudemos perceber, havia a necessidade de adicionar o begin/end para usar o rescue.

Agora, com o Ruby 2.5+, é mais simples:

# Para Ruby 2.5+
class XYZ
3.times.each do |i|
puts i
raise “erro”
rescue
puts “Recuperando-se do erro!”
end
end
=> 0
=> Recuperando-se do erro!
=> 1
=> Recuperando-se do erro!
=> 2
=> Recuperando-se do erro!

Ou seja, legível, menos poluído ou verboso.

Array#prepend/append

Na sequência, temos os novos métodos append e prepend para Arrays que nada mais são do que um alias para os antigos métodos push e unshift,respectivamente. Vejamos como era...

# Ruby <= 2.4
a = [1,2,3]
a.push(4)
a.push(5,6,7)
a.unshift(-1)
a.unshift(-3,-2)
puts a.inspect
=> [-3, -2, -1, 1, 2, 3, 4, 5, 6, 7]

e agora como ficou…

# Ruby 2.5+
a = [1,2,3]
a.append(4)
a.append(5,6,7)
a.prepend(-1)
a.prepend(-3,-2)
puts a.inspect
=> [-3, -2, -1, 1, 2, 3, 4, 5, 6, 7]

Acredito que você vai concordar comigo de que os métodos append e prependficaram muito mais expressivos e fáceis de entender.

String#delete_prefix/delete_suffix

Outros dois métodos novos são o delete_prefix e o delete_suffix. Entretanto, dessa vez são para Strings. Vejamos seu funcionamento.

puts ‘invisivel’.delete_prefix(‘in’) #=> visivel
puts ‘sorrindo’.delete_prefix(‘in’) #=> sorrindo
puts ‘comendo’.delete_suffix(‘ndo’) #=> come
puts ‘endoscopia’.delete_suffix(‘ndo’) #=> endoscopia

Como é de se notar, os dois novos métodos deixam muito simples a manipulação de sufixos e de prefixos em Strings.

Hash#transform_keys/transform_keys!

Hash também não ficou de fora e ganhou um novo método chamado transform_keys,o qualpermite alterar as chaves de um Hash baseado em um bloco. Exemplificando.

hash = { a: 1, b: 2 }
puts hash.transform_keys { |k| k.to_s }
puts hash
=> {"a"=>1, "b"=>2}
=> {:a=>1, :b=>2}

Perceba que o transform_keys não é um método destrutivo, mas caso você precise, existe o método transform_keys! (com exclamação) que o fará. Veja.

hash = { a: 1, b: 2 }
puts hash.transform_keys! { |k| k.to_s }
puts hash
=> {"a"=>1, "b"=>2}
=> {"a"=>1, "b"=>2}

Print backtrace and error message in reverse order

Dentre outras novidades, gostaria ainda de destacar a impressão de mensagens de erro de forma reversa.

Embora a nova funcionalidade seja experimental, sua funcionalidade consiste simplesmente em imprimir toda stack de erro de forma reversa. Isso porque, geralmente, o erro mostrava-se na última linha, e agora é mostrado na primeira, o que facilitará bastante nossa vida de programadores.

Antes, no Ruby 2.4

ruby error_message.rb
error_message.rb:1:in `/’: divided by 0 (ZeroDivisionError)
from 06-backtrace_error_message.rb:1:in `<main>’

Agora, no Ruby 2.5

ruby error_message.rb
Traceback (most recent call last):
1: error_message.rb:1:in `<main>’
error_message.rb:1:in `/’: divided by 0 (ZeroDivisionError)

Legal, hein! 🙂

Óbvio que essas não são as únicas novidades, mas já dá uma boa noção do que veremos daqui em diante.

É isso, gente!

Ahh... não se esquece de curtir a nossa página, blz?

Um forte abraço e até a próxima! 😉