What’s a Symbol?

In Ruby esistono due modi per definire un dato di tipo testuale:

il primo utilizza la classe String, il secondo utilizza la classe Symbol:

a = "lettera_a"
b = :lettera_b

utilizzando il metodo class possiamo verificare che a è un oggetto di classe String invece b è un oggetto di classe Symbol.

se creiamo altri due oggetti con le stesse espressioni letterali possiamo notare una cosa:

a2 = "lettera_a"
b2 = :lettera_b
a.object_id == a2.object_id       # false
b.object_id == b2.object_id       # true

le stringhe a ed a2, nonostante abbiano lo stesso contenuto, sono oggetti diversi!

invece i simboli b e b2 sono in realtà lo stesso simbolo.

Ora se creo un simbolo b3 convertendo una stringa con il contenuto “lettera_b” anche questo sarà una ulteriore istanza del simbolo :lettera_b

b3 = "lettera_b".to_sym
b3.object_id == b2.object_id         # true

Quanto osservato ha due implicazioni: la prima è che utilizzando i simboli al posto delle stringhe utilizziamo meno memoria, la seconda, più rilevante, è che dovendo confrontare due simboli l’interprete Ruby si limita a confrontare gli object_id, operazione ben più veloce di un confronto carattere per carattere.

 

 

Lascia un commento