I simboli sono identificatori con un nome che possono essere usati per fare riferimento a un valore.
I simboli si creano tramite un letterale simbolo, che consiste nel prefissare un nome con il carattere :, ad esempio :foo.
Possono anche essere scritti tra virgolette, ad esempio :"foo", il che consente, per esempio, di avere spazi nel nome.
:foo # => :foo
:"foo boo" # => :"foo boo"
I simboli sono usati in molti punti del linguaggio, ad esempio come chiavi negli hash, per rappresentare nomi di metodi e nomi di variabili.
Ciò che distingue i simboli dalle stringhe è che sono identificatori e non rappresentano dati o testo. Questo significa che due simboli con lo stesso nome sono sempre lo stesso oggetto.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
I simboli sono immutabili, il che significa che non possono essere modificati. Questo significa che quando «modifichi» un simbolo, in realtà ne stai creando uno nuovo. Ci sono alcuni metodi che si possono usare per manipolare i simboli: restituiscono tutti nuovi simboli. Tutti i metodi si trovano nella Symbol API.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
Il vantaggio dell'immutabilità dei simboli è che sono più efficienti in termini di memoria rispetto alle stringhe, ma anche più sicuri da usare come identificatori.
I simboli possono essere convertiti in stringhe e viceversa.
Questo può essere utile quando vuoi modificare un simbolo, o quando vuoi usare un simbolo come stringa.
Per presentare una stringa come simbolo, puoi usare il metodo String#to_sym, e per fare il contrario, puoi usare il metodo Symbol#to_s.
Poiché i simboli hanno un insieme limitato di metodi, può essere utile convertire un simbolo in una stringa per usare su di essa i metodi delle stringhe, se serve un nuovo simbolo.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
Il porto di Palermo è un porto molto trafficato, con molte navi che arrivano e partono. Da molto tempo utilizza un sistema manuale per tenere traccia delle navi attualmente presenti nel porto. Questo sistema è molto soggetto a errori e il capo del porto ha deciso di sostituirlo con un sistema informatizzato.
Il capo del porto ti ha assunto per implementare il nuovo sistema. Il sistema deve gestire gli identificatori delle navi, ma anche quelli delle destinazioni.
La prima cosa da fare è creare l'identificatore del porto di Palermo. L'identificatore è formato dalle prime quattro lettere del nome del porto, in maiuscolo.
Definisci la costante Port::IDENTIFIER come un simbolo con il valore :PALE.
Port::IDENTIFIER
# => :PALE
Il programma dovrà gestire anche altri porti, quindi devi creare degli identificatori anche per loro. Il porto vorrebbe che il sistema fosse automatizzato e, dato che i porti usano convenzioni di denominazione diverse, gli identificatori dovrebbero essere generati dal nome del porto. L'identificatore è formato dalle prime quattro lettere del nome del porto, in maiuscolo.
Definisci il metodo Port.get_identifier in modo che prenda come argomento una stringa e restituisca l'identificatore di quel porto come simbolo.
Port.get_identifier("Hamburg")
# => :HAMB
Il porto ha due terminal e il sistema deve determinare a quale terminal una nave debba attraccare. Il terminal è determinato dall'identificatore della nave.
L'identificatore è composto da 2 parti: la prima è formata da 3 lettere maiuscole che indicano quale carico trasporta la nave, poi 3 numeri che sono l'identificatore univoco della nave.
Se l'identificatore della nave riporta OIL o GAS, la nave deve attraccare al terminal A. Altrimenti la nave deve attraccare al terminal B.
Definisci il metodo Port.get_terminal in modo che prenda come argomento un simbolo, cioè l'identificatore della nave.
Il metodo deve restituire il terminal come simbolo.
Port.get_terminal(:OIL123)
# => :A
Iscriviti a Exercism per imparare e padroneggiare Ruby con 21 concetti121 esercizi e il mentoring di persone reali, tutto gratis.