E’ arrivato Babbo Natale e ci ha portato Ruby 2.3.0

Come annunciato dai Re Magi per Natale è stato rilasciato ruby 2.3.0

Le novità sono descritte in questo annuncio

Safe Navigation Operator

Quante volte nel nostro codice dovendo chiamare un metodo di un oggetto scordiamo di verificare se l’oggetto è istanziato oppure è nil?

I nostri programmi sono farciti di

aObject.aMethod if aObject

o meglio

aObject && aObject.aMethod

con Ruby 2.3 grazie al safe navigation operator &. possiamo semplificare tutto:

aObject&.aMethod

did_you_mean gem

Quando si verifica un NameError o un NoMethodError questa gemma suggerisce nel messaggio di errore il probabile nome che avremmo voluto utilizzare

"Yuki".starts_with?("Y")
 # => NoMethodError: undefined method `starts_with?' for "Yuki":String
 # Did you mean? start_with?

Frozen Strings Literal

In Ruby di default le stringhe sono oggetti mutable, cioè possiamo modificarne il contenuto senza riassegnarle:

s = 'foo'
s[0] = 'm'

Per rendere immutable una stringhe possiamo utilizzare il metodo #freeze

s = 'bar'.freeze

Poichè da Ruby 3.x le stringhe diventeranno per default immutable, nella versione 2.3 è stato introdutto un comando che ci aiuterà a prendere confidenza con questa nuova feature: è sufficiente aggiungere un commento all’inizio del file .rb

#frozen_string_literal: true

Ma perchè le stringhe devono essere immutable? Per migliorare le prestazioni: utilizzando le stringhe immutable viene allocata meno memoria per questi oggetti. Per approfondire l’argomento leggete l’articolo di Alexis Mas immutable strings in ruby 2.3

Indented HEREDOC

Come tutti sappiamo, il costrutto heredoc permette di inserire nel codice una vasta porzione di testo, in questa release viene introdotto lo squiggly heredoc che permette di indentare la porzione di testo :

expected_result = <<~SQUIGGLY_HEREDOC
  This would contain specially formatted
  text.That might span many lines
SQUIGGLY_HEREDOC

ovviamente potete usare come delimitatore qualsiasi stringa maiuscola, quello che conta è che sia preceduta da <<~