Ruby είναι μια πολύ γνωστή γλώσσα προγραμματισμού. Στοχεύει στη βελτίωση της απλότητας και της παραγωγικότητας. Είναι επίσης μια πλήρως αντικειμενοστρεφής γλώσσα προγραμματισμού. Επιπλέον, η Ruby συνοδεύεται από ένα κομψό συντακτικό που είναι φυσικό στην ανάγνωση και εύκολο στη γραφή.
Κάθε προγραμματισμός απαιτεί τη διαχείριση διαφόρων τύπων δεδομένων. Ένας τύπος δεδομένων περιγράφει μια συγκεκριμένη κατηγορία δεδομένων. Λέει στο μηχάνημα πώς πρέπει να χειριστεί τα δεδομένα στο πρόγραμμα. Οι τύποι δεδομένων είναι κρίσιμοι για τον καθορισμό του τι μπορεί να γίνει με τα δεδομένα (συμπεριλαμβανομένων των λειτουργιών που μπορούν να εκτελεστούν). Σε αυτόν τον οδηγό, θα εμβαθύνουμε στους τύπους δεδομένων που είναι διαθέσιμοι στη Ruby. Θα εξερευνήσουμε επίσης τη δυναμική πληκτρολόγηση. Χρησιμοποιώντας αυτή τη δυνατότητα, η Ruby μπορεί να προσδιορίσει αυτόματα τον τύπο δεδομένων μιας μεταβλητής χωρίς να τον δηλώσει ρητά. Ας ξεκινήσουμε!
Προαπαιτούμενα
Για να εξασκηθείτε και να εφαρμόσετε τα βήματα που παρουσιάζονται σε αυτόν τον οδηγό, θα χρειαστείτε τα ακόλουθα στοιχεία:
- Ένα σωστά ρυθμισμένο σύστημα Linux. Μάθετε περισσότερα σχετικά με τη δημιουργία ενός προσωπικού διακομιστή Ubuntu στο CloudSigma.
- Ένα σωστά ρυθμισμένο περιβάλλον ανάπτυξης Ruby. Δείτε την επίσημη τεκμηρίωση για την εγκατάσταση της Ruby στο Ubuntu (χρησιμοποιώντας APT).
Τύποι δεδομένων στη Ruby
Η Ruby διαθέτει όλους τους κοινούς τύπους δεδομένων που θα συναντήσετε σε οποιαδήποτε γλώσσα προγραμματισμού: ακέραιους, floats, strings, arrays, symbols, hashes κ.λπ. Στη συνέχεια, θα παρέχουμε μια επισκόπηση του πώς να εργάζεστε με τους διάφορους τύπους δεδομένων της Ruby.
Step 1 – Ακέραιοι
Παρόμοια με τα μαθηματικά, οι integers στον προγραμματισμό υπολογιστών είναι ολόκληροι αριθμοί. Η τιμή μπορεί να είναι θετική, αρνητική ή 0. Το εύρος τιμών είναι το εξής:
|
1 |
{-∞, …, -1, 0, 1, …, ∞} |
Ώρα να δοκιμάσετε τους ακέραιους στη Ruby. Το πρώτο παράδειγμα είναι η εκτύπωση ενός απλού ακέραιου στην οθόνη:
|
1 2 |
print 99 print "\n" |
Next, we will work with an integer variable. Here, the variable sample_int contains an integer value (99) and the print function prints the variable value on the screen:
|
1 2 3 |
sample_int = 99 print sample_int print "\n" |
Μπορούμε επίσης να κάνουμε μαθηματικά με ακέραιους. Το ακόλουθο παράδειγμα δείχνει ένα απλό άθροισμα δύο ακέραιων αριθμών:
|
1 2 3 |
sample_int = 99 + 100 print sample_int print "\n" |
Όταν εργαζόμαστε με μεγάλους αριθμούς, χρησιμοποιούμε συχνά κόμματα (,) για να διευκολύνουμε την ανάγνωση. Για παράδειγμα, το ένα εκατομμύριο (1000000) γράφεται ως 1,000,000 για καλύτερη αναγνωσιμότητα. Αν και η χρήση κόμματος απαγορεύεται, η Ruby επιτρέπει τη χρήση κάτω παύλας ( _) ως διαχωριστικό. Ρίξτε μια ματιά στο ακόλουθο παράδειγμα:
|
1 2 3 |
sample_int = 1_000_999 print sample_int print "\n" |
Η χρήση κάτω παύλας βελτιώνει την αναγνωσιμότητα του κώδικα, ειδικά όταν πρόκειται για μεγάλες ακέραιες τιμές.
Step 2 – Αριθμοί κινητής υποδιαστολής
A floating-point number (ή float για συντομία) αντιπροσωπεύει έναν πραγματικό αριθμό. Παρόμοια με τον μαθηματικό ορισμό, οι πραγματικοί αριθμοί μπορεί να είναι ρητοί ή άρρητοι. Στη Ruby, ένας float είναι βασικά ένας αριθμός που περιέχει μια υποδιαστολή.
Ας δοκιμάσουμε να εκτυπώσουμε μια τιμή float στην οθόνη:
|
1 2 |
print 55.66 print "\n" |
Το επόμενο παράδειγμα δείχνει τη δήλωση μιας μεταβλητής float:
|
1 2 3 |
sample_float = 55.66 print sample_float print "\n" |
Μπορούμε επίσης να εκτελέσουμε διάφορες μαθηματικές πράξεις στις τιμές και τις μεταβλητές float. Το ακόλουθο παράδειγμα δείχνει ένα απλό άθροισμα δύο αριθμών float:
|
1 2 3 |
sample_float = 55.66 + 99.222 print sample_float print "\n" |
Τι γίνεται αν προσθέσουμε έναν float και έναν ακέραιο; Η προκύπτουσα τιμή θα είναι float. Στο ακόλουθο παράδειγμα, παρόλο που το 55.0 είναι ένας ολόκληρος αριθμός, αντιμετωπίζεται ως float:
|
1 2 3 |
sample_float = 55.0 + 10 print sample_float print "\n" |
Step 3 – Boolean
Οι τιμές Booleans αντιπροσωπεύουν τις τιμές αλήθειας του κλάδου της λογικής των μαθηματικών. Στη Ruby, οι τύποι δεδομένων Boolean αντιπροσωπεύονται από δύο τιμές: true και false:
-
Μεγαλύτερο από
-
100 > 99: true
-
99 > 100: false
-
-
Μικρότερο από
-
500 < 999: true
-
999 < 500: false
-
-
Ίσο
-
10 == 10: true
-
9 == 99: false
-
Παρόμοια με τους αριθμούς, μπορούμε επίσης να αποθηκεύσουμε μια τιμή true ή false τιμή σε μια μεταβλητή. Το ακόλουθο παράδειγμα επιδεικνύει αυτή τη δυνατότητα:
|
1 2 3 |
result = 9 == 99 print result print "\n" |
Step 4 – Συμβολοσειρές
Στον προγραμματισμό, μια συμβολοσειρά αναπαρίσταται ως μια ακολουθία χαρακτήρων (γράμματα, αριθμοί και σύμβολα). Στη Ruby, οι συμβολοσειρές υπάρχουν μέσα σε μονά εισαγωγικά ( ') ή διπλά εισαγωγικά ( "). Έχουμε ήδη καλύψει λεπτομερώς τη χρήση συμβολοσειρών στη Ruby, οπότε αυτή θα είναι μια σύντομη ενότητα.
Το ακόλουθο παράδειγμα είναι ένα βασικό hello world πρόγραμμα στη Ruby:
|
1 |
print "hello world!\n" |
Μπορούμε επίσης να αποθηκεύσουμε συμβολοσειρές σε μεταβλητές. Το ακόλουθο παράδειγμα ενσωματώνει επίσης τη συνένωση συμβολοσειρών:
|
1 2 |
username = "Cloudsigma" print "hello, " + username + "!\n" |
Step 5 – Πίνακες
Ένας πίνακας είναι μια δομή δεδομένων που μπορεί να αποθηκεύσει μια συλλογή στοιχείων σταθερού μεγέθους του ίδιου τύπου δεδομένων. Μπορεί επίσης να νοηθεί ως μια συλλογή μεταβλητών του ίδιου τύπου δεδομένων. Είναι μία από τις πιο θεμελιώδεις δομές δεδομένων στις περισσότερες σύγχρονες γλώσσες προγραμματισμού.
Στη Ruby, ένας πίνακας ορίζεται ως εξής:
|
1 |
[value_1, value_2, …, value_N] |
Είναι δυνατό να δημιουργήσετε έναν πίνακα με οποιουσδήποτε άλλους τύπους δεδομένων έχουμε συζητήσει μέχρι τώρα (ακέραιους, αριθμούς κινητής υποδιαστολής και συμβολοσειρές). Ακολουθούν μερικά παραδείγματα:
-
Ακέραιος: [-5, 0, 5]
-
Κινητής υποδιαστολής: [-9.99, -6.99, -3.99, 0, 3.99]
-
Συμβολοσειρά: [“the”, “quick”, “brown”, “fox”]
Το ακόλουθο παράδειγμα υλοποιεί όλους αυτούς τους τύπους πινάκων:
|
1 2 3 4 5 6 |
print [-5, 0, 5] print "\n" print [-9.99, -6.99, -3.99, 0, 3.99] print "\n" print ["the", "quick", "brown", "fox"] print "\n" |
Σημειώστε ότι όταν η συνάρτηση print συναντά έναν πίνακα, εκτυπώνει ολόκληρο τον πίνακα στην οθόνη. Για μεγαλύτερη ευκολία, θα συναντάτε συχνά πίνακες ως μεταβλητές. Ας ενημερώσουμε τον κώδικα:
|
1 2 3 4 5 6 7 8 9 10 |
array_int = [-5, 0, 5] print array_int print "\n" array_float = [-9.99, -6.99, -3.99, 0, 3.99] print array_float print "\n" array_string = ["the", "quick", "brown", "fox"] print array_string print "\n" |
Τώρα, μπορούμε να εργαστούμε με μεμονωμένα στοιχεία των πινάκων:
|
1 2 3 4 5 6 7 8 9 |
array_int = [-5, 0, 5] print array_int[2] print "\n" array_float = [-9.99, -6.99, -3.99, 0, 3.99] print array_float[1] print "\n" array_string = ["the", "quick", "brown", "fox"] print array_string[3] print "\n" |
Σημειώστε ότι στη Ruby, η τιμή του δείκτη των πινάκων ξεκινά από το 0.
Για ευκολία, οι πίνακες στη Ruby συνοδεύονται από τις μεθόδους .first και .last που εκτυπώνουν το πρώτο και το τελευταίο στοιχείο:
|
1 2 3 4 |
array_float = [-9.99, -6.99, -3.99, 0, 3.99] puts array_float.first puts array_float.last print "\n" |
Στη Ruby, οι πίνακες έχουν ένα άλλο ενδιαφέρον χαρακτηριστικό. Μπορούν να περιέχουν διαφορετικούς τύπους δεδομένων ταυτόχρονα. Για παράδειγμα, μπορείτε να αποθηκεύσετε συμβολοσειρές, σύμβολα, ακόμη και άλλους πίνακες:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
mixed_array = [ "hello", 99.99, "world", [ "the", "quick", "brown", "fox" ] ] print mixed_array print "\n" print mixed_array[3] print "\n" |
Step 6 – Symbols
In Ruby, a σύμβολο είναι ένας ειδικός τύπος δεδομένων που λειτουργεί σαν ετικέτα ή αναγνωριστικό. Τα σύμβολα είναι αμετάβλητα, που σημαίνει ότι δεν μπορούν να αλλάξουν. Τα σύμβολα εμφανίζονται σαν να δηλώνουν μεταβλητές χωρίς καμία τιμή.
Ορίστε ένα παράδειγμα συμβόλου:
|
1 |
:time_zone |
Γενικά, τα σύμβολα χρησιμοποιούνται για τον προσδιορισμό κάποιου σημαντικού στοιχείου. Για άλλες περιπτώσεις, ωστόσο, τα αλφαριθμητικά είναι υπεραρκετά.
Η Ruby, όντας μια αντικειμενοστρεφής γλώσσα, αντιμετωπίζει τα πάντα ως αντικείμενο (συμπεριλαμβανομένων των αλφαριθμητικών) με τη δική του μοναδική θέση μνήμης, ακόμη και αν τα αλφαριθμητικά είναι πανομοιότυπα. Ωστόσο, όταν αναφέρεστε σε ένα σύμβολο, πρόκειται για το ίδιο αντικείμενο παντού στο πρόγραμμα, στην ίδια θέση μνήμης.
Step 7 – Hashes
Ένα hash είναι μια συλλογή κλειδιών και τιμών που μοιάζει με λεξικό. Συχνά, τα hashes χρησιμοποιούνται για την αποθήκευση σχετικών δεδομένων, για παράδειγμα, πληροφοριών σχετικά με έναν χρήστη.
Ορίστε ένα γρήγορο παράδειγμα ενός hash. Έχουμε δημιουργήσει ένα hash user_info που περιέχει το όνομα χρήστη και τον κωδικό πρόσβασης ενός χρήστη:
|
1 2 3 4 5 6 |
user_info = { "username" => "HelloWorld999", "password" => "password123" } print user_info print "\n" |
Για να ανακτήσουμε τις τιμές ενός ζεύγους κλειδιού-τιμής, πρέπει να χρησιμοποιήσουμε το κλειδί. Το ακόλουθο παράδειγμα δείχνει αυτή τη διαδικασία:
|
1 2 3 4 5 6 7 |
user_info = { "username" => "HelloWorld999", "password" => "password123" } print user_info["username"] print "\n" |
Η Ruby επιτρέπει επίσης τον ορισμό ενός hash χρησιμοποιώντας ελαφρώς διαφορετικές συντάξεις ( : αντί για =>):
|
1 2 3 4 5 6 |
user_info = { username: "HelloWorld999", password: "password123" } print user_info[:password] print "\n" |
Αυτή η δομή σύνταξης είναι παρόμοια με τη σύνταξη που χρησιμοποιείται σε άλλες γλώσσες, για παράδειγμα, στη JavaScript. Σε αυτή τη δομή σύνταξης, τα κλειδιά ορίζονται ως σύμβολα. Γι' αυτό, αντί να χρησιμοποιούμε "username", χρησιμοποιούμε: username για να αποκτήσουμε πρόσβαση στην τιμή.
Δυναμικός καθορισμός τύπων
Ίσως έχετε ήδη παρατηρήσει ότι κατά τη δήλωση μιας μεταβλητής, δεν χρειάζεται να ορίσουμε ρητά έναν τύπο δεδομένων. Αντίθετα, η τιμή της μεταβλητής καθορίζει τον τύπο δεδομένων. Η Ruby χρησιμοποιεί δυναμικό καθορισμό τύπων όπου ο έλεγχος τύπων εκτελείται κατά τον χρόνο εκτέλεσης. Αντίθετα, οι τύποι δεδομένων καθορίζονται κατά τη μεταγλώττιση στις γλώσσες προγραμματισμού με στατικό καθορισμό τύπων (για παράδειγμα, C/C++).
Στο ακόλουθο παράδειγμα, όλες οι τιμές που εκχωρούνται στη μεταβλητή dyn_var είναι έγκυρες:
|
1 2 3 4 5 |
dyn_var = 123 dyn_var = 456.789 dyn_var = true dyn_var = "the quick brown fox" dyn_var |
Στις γλώσσες με δυναμικό καθορισμό τύπων, είμαστε ελεύθεροι να επαναχρησιμοποιήσουμε μια υπάρχουσα μεταβλητή για να αποθηκεύσουμε διαφορετικούς τύπους δεδομένων. Εδώ, το προηγούμενο παράδειγμα έχει ενημερωθεί για να δείξει αυτό το φαινόμενο:
|
1 2 3 4 5 6 7 |
dyn_var = 123 puts dyn_var dyn_var = 456.789 dyn_var = true dyn_var = "the quick brown fox" puts dyn_var dyn_var |
Όπως δείχνει αυτό το παράδειγμα, κάθε φορά που εκχωρείται μια νέα τιμή, αλλάζει ο τύπος δεδομένων της dyn_var κατά την εκτέλεση. Αυτό είναι χρήσιμο κατά τη μετατροπή ενός τύπου δεδομένων σε έναν άλλο. Το ακόλουθο παράδειγμα το δείχνει αυτό:
|
1 2 3 4 |
print "enter length: " length = gets.chop length = length.to_f puts length |
Εδώ,
-
Επειδή οι είσοδοι από το πληκτρολόγιο είναι αλφαριθμητικά, length είναι αρχικά ένα αλφαριθμητικό.
-
Καθώς η επιθυμητή τιμή μας είναι ένας αριθμός κινητής υποδιαστολής (float), μετατρέπουμε την τιμή του αλφαριθμητικού σε float χρησιμοποιώντας τη μέθοδο to_f.
-
Λόγω της αλλαγής της τιμής, στη length εκχωρείται ο τύπος δεδομένων float. Αυτό είναι που βλέπουμε όταν εκτυπώνουμε την τιμή της στην οθόνη.
Τι θα συνέβαινε αν προσπαθούσαμε να αναμίξουμε δύο διαφορετικούς τύπους δεδομένων μαζί; Η Ruby θα εμφανίσει σφάλμα. Ρίξτε μια ματιά:
|
1 |
print 9 + "77" |
Αναγνώριση τύπου δεδομένων
Στη Ruby, τα πάντα αντιμετωπίζονται ως αντικείμενο. Κάθε αντικείμενο στη Ruby συνοδεύεται από τη μέθοδο class. Όταν καλείται, αυτή η μέθοδος αναφέρει ποιος είναι ο τύπος δεδομένων της πηγής. Ακολουθούν μερικά παραδείγματα χρήσης της class μεθόδου:
|
1 2 3 4 |
puts 55.class puts (55.55).class puts true.class puts nil.class |
Ένας άλλος τρόπος για να βρείτε τον τύπο δεδομένων είναι η χρήση της kind_of? μεθόδου. Ελέγχει τον τύπο δεδομένων του αντικειμένου σε σχέση με τον τύπο δεδομένων που ζητήθηκε και επιστρέφει μια τιμή Boolean. Δείτε το στο ακόλουθο παράδειγμα:
|
1 2 |
puts 55.kind_of?(Float) puts 55.kind_of?(Integer) |
Παρομοίως, υπάρχει μια άλλη μέθοδος is_a? που συγκρίνει τον τύπο δεδομένων και επιστρέφει μια τιμή Boolean. Η μόνη διαφορά είναι η ετικέτα της μεθόδου. Ωστόσο, μπορεί να είναι προτιμότερη επειδή είναι λίγο πιο εύκολη στην ανάγνωση και την κατανόηση από τους προγραμματιστές. Ενημερώστε το προηγούμενο παράδειγμα με is_a?:
|
1 2 |
puts 55.is_a?(Float) puts 55.is_a?(Integer) |
Τελικές Σκέψεις
Η εργασία με οποιαδήποτε γλώσσα προγραμματισμού απαιτεί καλή κατανόηση των τύπων δεδομένων που υποστηρίζει. Σε αυτόν τον οδηγό, εξερευνήσαμε τους πιο κοινούς τύπους δεδομένων που χρησιμοποιούνται στον προγραμματισμό με Ruby. Συζητήσαμε και παρουσιάσαμε ακέραιους, αριθμούς κινητής υποδιαστολής, συμβολοσειρές, σύμβολα, Boolean και hashes (με παραδείγματα).
Ρίξτε μια ματιά σε περισσότερους οδηγούς από το ιστολόγιό μας που θα σας βοηθήσουν να εξερευνήσετε τη Ruby:
- Εγκατάσταση του Ruby on Rails με το RVM σε Ubuntu 20.04
- Ρύθμιση του Ruby on Rails με PostgreSQL
- Χρήση της MySQL με εφαρμογή Ruby on Rails σε Ubuntu 21.04
- Εξερευνώντας το CloudSigma PaaS: Πώς να χρησιμοποιήσετε τις υπηρεσίες φιλοξενίας Ruby PaaS;
Καλό προγραμματισμό!




































Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.