Τα symbols είναι ονομασμένα αναγνωριστικά που μπορούν να χρησιμοποιηθούν για να αναφέρονται σε μια τιμή.
Τα symbols δημιουργούνται μέσω ενός κυριολεκτικού symbol, βάζοντας δηλαδή μπροστά από ένα όνομα τον χαρακτήρα :, π.χ. :foo.
Μπορούν επίσης να γραφτούν και με εισαγωγικά, π.χ. :"foo", κάτι που επιτρέπει, για παράδειγμα, κενά μέσα στο όνομα.
:foo # => :foo
:"foo boo" # => :"foo boo"
Τα symbols χρησιμοποιούνται σε πολλά σημεία της γλώσσας, μεταξύ άλλων ως κλειδιά σε hashes, για να αναπαριστούν ονόματα μεθόδων και ονόματα μεταβλητών.
Αυτό που κάνει τα symbols διαφορετικά από τις συμβολοσειρές είναι ότι είναι αναγνωριστικά και δεν αναπαριστούν δεδομένα ή κείμενο. Αυτό σημαίνει ότι δύο symbols με το ίδιο όνομα είναι πάντα το ίδιο αντικείμενο.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
Τα symbols είναι αμετάβλητα, που σημαίνει ότι δε μπορούν να τροποποιηθούν. Αυτό σημαίνει ότι όταν "τροποποιείς" ένα symbol, στην πραγματικότητα δημιουργείς ένα νέο symbol. Υπάρχουν μερικές μέθοδοι που μπορούν να χρησιμοποιηθούν για τον χειρισμό symbols και όλες επιστρέφουν νέα symbols. Όλες οι μέθοδοι βρίσκονται στο Symbol API.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
Το πλεονέκτημα του ότι τα symbols είναι αμετάβλητα είναι ότι είναι πιο αποδοτικά ως προς τη μνήμη από τις συμβολοσειρές, αλλά και ασφαλέστερα στη χρήση ως αναγνωριστικά.
Τα symbols μπορούν να μετατραπούν σε συμβολοσειρές και αντίστροφα.
Αυτό μπορεί να φανεί χρήσιμο όταν θέλεις να τροποποιήσεις ένα symbol ή όταν θέλεις να χρησιμοποιήσεις ένα symbol ως συμβολοσειρά.
Για να παρουσιάσεις μια συμβολοσειρά ως symbol, μπορείς να χρησιμοποιήσεις τη μέθοδο String#to_sym και για το αντίθετο, τη μέθοδο Symbol#to_s.
Επειδή τα symbols έχουν περιορισμένο σύνολο μεθόδων, μπορεί να φανεί χρήσιμο να μετατρέψεις ένα symbol σε συμβολοσειρά για να χρησιμοποιήσεις πάνω του μεθόδους συμβολοσειρών, αν χρειάζεσαι ένα νέο symbol.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
Το λιμάνι του Παλέρμο είναι ένα πολυσύχναστο λιμάνι, με πολλά πλοία να έρχονται και να φεύγουν. Εδώ και πολύ καιρό χρησιμοποιεί ένα χειροκίνητο σύστημα για να παρακολουθεί τα πλοία που βρίσκονται αυτή τη στιγμή στο λιμάνι. Αυτό το σύστημα είναι πολύ επιρρεπές σε λάθη και ο λιμενάρχης αποφάσισε να το αντικαταστήσει με ένα μηχανογραφημένο σύστημα.
Ο λιμενάρχης σε προσέλαβε για να υλοποιήσεις το νέο σύστημα. Το σύστημα πρέπει να χειρίζεται αναγνωριστικά για πλοία, αλλά και για προορισμούς.
Το πρώτο πράγμα που πρέπει να κάνεις είναι να δημιουργήσεις το αναγνωριστικό για το λιμάνι του Παλέρμο. Το αναγνωριστικό είναι τα πρώτα τέσσερα γράμματα του ονόματος του λιμανιού, με κεφαλαία.
Όρισε τη σταθερά Port::IDENTIFIER να είναι ένα σύμβολο με την τιμή :PALE.
Port::IDENTIFIER
# => :PALE
Το πρόγραμμα θα πρέπει επίσης να χειρίζεται άλλα λιμάνια, οπότε πρέπει να δημιουργήσεις αναγνωριστικά και για αυτά. Το λιμάνι θα ήθελε το σύστημα να είναι αυτοματοποιημένο και, καθώς τα λιμάνια χρησιμοποιούν διαφορετικές συμβάσεις ονοματοδοσίας, τα αναγνωριστικά θα πρέπει να δημιουργούνται από το όνομα του λιμανιού. Το αναγνωριστικό είναι τα πρώτα τέσσερα γράμματα του ονόματος του λιμανιού, με κεφαλαία.
Όρισε τη μέθοδο Port.get_identifier ώστε να παίρνει μια συμβολοσειρά ως όρισμα και να επιστρέφει το αναγνωριστικό για αυτό το λιμάνι ως σύμβολο.
Port.get_identifier("Hamburg")
# => :HAMB
Το λιμάνι έχει δύο τερματικούς σταθμούς και το σύστημα πρέπει να προσδιορίζει σε ποιον τερματικό σταθμό πρέπει να δέσει ένα πλοίο. Ο τερματικός σταθμός καθορίζεται από το αναγνωριστικό του πλοίου.
Το αναγνωριστικό αποτελείται από 2 μέρη: το πρώτο μέρος αποτελείται από 3 κεφαλαία γράμματα που δηλώνουν ποιο φορτίο μεταφέρει το πλοίο και, στη συνέχεια, 3 αριθμούς που είναι το μοναδικό αναγνωριστικό του πλοίου.
Αν το αναγνωριστικό του πλοίου μεταφέρει: OIL ή GAS, το πλοίο πρέπει να δέσει στον τερματικό σταθμό A. Αλλιώς, το πλοίο πρέπει να δέσει στον τερματικό σταθμό B.
Όρισε τη μέθοδο Port.get_terminal ώστε να παίρνει ως όρισμα ένα σύμβολο, το οποίο είναι το αναγνωριστικό του πλοίου.
Η μέθοδος πρέπει να επιστρέφει τον τερματικό σταθμό ως σύμβολο.
Port.get_terminal(:OIL123)
# => :A
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Ruby με 21 έννοιες121 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.