Η κατανόηση των enums και της αντιστοίχισης προτύπων είναι θεμελιώδης στο Rust. Εξερευνήστε αποτελεσματικές τεχνικές για την εφαρμογή και των δύο.
Το Rust παρέχει διάφορους τύπους δεδομένων για την εκτέλεση λειτουργιών, από βασικούς τύπους δεδομένων όπως συμβολοσειρές, ακέραιους και αιωρούμενους σημειώνουν αριθμούς σε σύνθετους τύπους δεδομένων όπως διανύσματα και πίνακες σε σύνθετους τύπους δεδομένων όπως δομές και απαριθμήσεις.
Το Enums (enumerations) είναι ένας τύπος δεδομένων που επιτρέπει την αναπαράσταση ενός σταθερού συνόλου τιμών, όπως οι ημέρες της εβδομάδας και το χρώμα του ουράνιου τόξου. Τα enum είναι χρήσιμα όταν οι πιθανές τιμές για μια μεταβλητή είναι περιορισμένες και γνωστές.
Ορισμός Enums στο Rust
Η δήλωση enums στο Rust είναι παρόμοια με δήλωση αριθμών σε C#. Θα χρησιμοποιήσετε το αρίθμηση λέξη-κλειδί που ακολουθεί το όνομα και ένα σύνολο σγουρά άγκιστρα για τον ορισμό απαρίθμησης. Μπορείτε να ορίσετε τις πιθανές παραλλαγές (οντότητες) μέσα στα σγουρά άγκιστρα με ένα κόμμα ως διαχωριστικό.
Ακολουθεί ένα πλήθος για τις ημέρες της εβδομάδας:
αρίθμησηΚαθημερινή {
Δευτέρα,
Τρίτη,
Τετάρτη,
Πέμπτη,
Παρασκευή,
Σάββατο,
Κυριακή,
}
ο Καθημερινή Το enum αντιπροσωπεύει τις ημέρες της εβδομάδας. ο παραλλαγές είναι τα ονόματα της ημέρας και δεν έχουν σχετικές τιμές. Επίσης, οι παραλλαγές του enum σας μπορεί να είναι οποιεσδήποτε Τύπος δεδομένων σκουριάς.
Μπορείτε να αποκτήσετε πρόσβαση σε παραλλαγές καθορίζοντας το όνομα της παραλλαγής χρησιμοποιώντας τον τελεστή διαχωρισμού διαδρομής (::) στο enum.
αφήνω ημέρα = Καθημερινή:: Δευτέρα;
// έκδοση με στατική πληκτρολόγηση της μεταβλητής `day`
αφήνω day: Weekday = Weekday:: Monday;
Ο κωδικός καθορίζει ότι θέλετε να αποκτήσετε πρόσβαση στο Δευτέρα παραλλαγή του αριθμού της εβδομάδας.
Παραλλαγές και Διακρίσεις των Enums
Οι παραλλαγές ενός enum συσχετίζονται με ακέραιες τιμές που ονομάζονται διακριτική. Από προεπιλογή, οι τιμές διάκρισης ξεκινούν από το μηδέν και αυξάνονται κατά 1 για τις επόμενες παραλλαγές. Ωστόσο, είναι δυνατό να καθοριστούν προσαρμοσμένες τιμές διάκρισης για κάθε παραλλαγή.
Ακολουθεί ένα παράδειγμα της λίστας Weekday με παραλλαγές που έχουν εκχωρηθεί με τιμή.
αρίθμησηΚαθημερινή {
Δευτέρα = 1,
Τρίτη = 2,
Τετάρτη = 3,
Πέμπτη = 4,
Παρασκευή = 5,
Σάββατο = 6,
Κυριακή = 7,
}
Το Weekday enum έχει επτά παραλλαγές που αντιπροσωπεύουν κάθε ημέρα της εβδομάδας και κάθε ημέρα έχει μια τιμή (που ονομάζεται διάκριση) που τους έχει εκχωρηθεί. Οι παραλλαγές είναι με τη σειρά από την πρώτη έως την τελευταία ημέρα της εβδομάδας.
Μπορείτε να αποκτήσετε πρόσβαση στην τιμή διάκρισης χρησιμοποιώντας το όνομα της παραλλαγής.
στκύριος() {
println!("Δευτέρα: {}", Καθημερινά:: Δευτέρα όπως καιi32);
println!("Τρίτη: {}", Καθημερινά:: Τρίτη όπως καιi32);
println!("Τετάρτη: {}", Εβδομαδιαία:: Τετάρτη όπως καιi32);
println!("Πέμπτη: {}", Καθημερινά:: Πέμπτη όπως καιi32);
println!("Παρασκευή: {}", Εβδομαδιαία:: Παρασκευή όπως καιi32);
println!("Σάββατο: {}", Εβδομαδιαία:: Σάββατο όπως καιi32);
println!("Κυριακή: {}", Εβδομαδιαία:: Κυριακή όπως καιi32);
}
ο println! Η μακροεντολή χρησιμοποιείται για την εκτύπωση των διακριτικών. Κάθε εκτύπωση! Η επίκληση μακροεντολών παίρνει δύο ορίσματα: μια συμβολοσειρά μορφής και μια τιμή. Η συμβολοσειρά μορφοποίησης καθορίζει τον τρόπο διαμόρφωσης της εξόδου. η τιμή είναι η πραγματική τιμή που εκτυπώνεται.
Σε αυτήν την περίπτωση, η συμβολοσειρά μορφής είναι μια κυριολεκτική συμβολοσειρά που περιέχει το όνομα της εβδομάδας και η τιμή είναι η παραλλαγή enum με ρητή μετάδοση στο i32 ακέραιος τύπος.
Το ρητό cast στο i32 είναι απαραίτητο επειδή τα Rust enums αντιπροσωπεύονται ως ακέραιοι, αλλά ο συγκεκριμένος ακέραιος τύπος εξαρτάται από το μέγεθος του enum. Από προεπιλογή, το Rust εκχωρεί τον μικρότερο ακέραιο τύπο που μπορεί να αντιπροσωπεύει όλα τα διακριτικά στο enum. Αλλά σε αυτήν την περίπτωση, θέλετε να εκτυπώσετε τις τιμές ως ακέραιους αριθμούς i32, επομένως πρέπει να τις μεταδώσετε ρητά.
Εδώ είναι το αποτέλεσμα από την εκτέλεση του κύριος λειτουργία:
Μοτίβα που ταιριάζουν στη σκουριά
Η αντιστοίχιση μοτίβων είναι μια κατασκευή δομής ελέγχου Rust χρήσιμη για τον εντοπισμό προτύπων δεδομένων. Η αντιστοίχιση μοτίβων επιτρέπει τη σύνταξη συνοπτικού και αποτελεσματικού κώδικα κατά τη λειτουργία προηγμένες δομές δεδομένων ή την εκτέλεση πολύπλοκων λειτουργιών.
Θα χρησιμοποιήσετε το αγώνας λέξη-κλειδί ακολουθούμενη από το => διαχωριστικό για το σχέδιο και τη λειτουργία για το σχέδιο, αντίστοιχα. Το μοτίβο μπορεί να είναι οποιαδήποτε έκφραση Rust, συμπεριλαμβανομένων των κυριολεκτικών, μεταβλητών και κλήσεων συναρτήσεων.
Ακολουθεί ένα παράδειγμα δήλωσης αγώνα:
στκύριος(){
αφήνω x = 5;
αγώνας Χ {
1 => println!("ένας"),
2 => println!("δύο"),
3 => println!("τρία"),
// εκτελείται εάν κανένα από τα μοτίβα δεν ταιριάζει
_ => println!("κάτι άλλο"),
}
}
ο κύριος ταιριάζει λειτουργία Χ σε πολλά μοτίβα και στη συνέχεια εκτυπώνει την τιμή με βάση την τιμή του x. Το μοτίβο υπογράμμισης (_) είναι ένα μοτίβο μπαλαντέρ που χρησιμοποιείται ως συμπλήρωμα για περιπτώσεις που δεν αντιμετωπίζονται ρητά.
Αριθμοί και αντιστοίχιση προτύπων
Οι αριθμοί και η αντιστοίχιση προτύπων είναι χρήσιμα για την έκφραση και την εργασία με προηγμένες δομές δεδομένων με ασφαλή και αποτελεσματικό τρόπο. Μπορείτε να χρησιμοποιήσετε τους αριθμούς για να ορίσετε ένα σταθερό σύνολο τιμών και αντιστοίχιση μοτίβων για να εργαστείτε με αυτές τις τιμές.
Εδώ είναι ένα πλήθος για τα χρώματα σε ένα ουράνιο τόξο:
αρίθμησηΟΥΡΑΝΙΟ ΤΟΞΟ {
Το κόκκινο,
Πορτοκάλι,
Κίτρινος,
Πράσινος,
Μπλε,
Ινδικό,
Βιολέτα,
}
Κάθε παραλλαγή του ΟΥΡΑΝΙΟ ΤΟΞΟ το enum αντιπροσωπεύει ένα χρώμα του ουράνιου τόξου. Μπορείτε να χρησιμοποιήσετε την αντιστοίχιση μοτίβων με τη δήλωση αντιστοίχισης για να αντιστοιχίσετε μοτίβα με την παραλλαγή για να ελέγξετε τη ροή του προγράμματος με βάση το χρώμα του ουράνιου τόξου.
Ακολουθεί μια συνάρτηση που παίρνει την παραλλαγή χρώματος από τον κατάλογο Rainbow και εκτυπώνει ένα μήνυμα με βάση το χρώμα.
στprint_color(χρώμα: Ουράνιο τόξο) {
αγώνας χρώμα {
Ουράνιο τόξο:: Κόκκινο => println!("Το χρώμα είναι κόκκινο!"),
Ουράνιο τόξο:: Πορτοκαλί => println!("Το χρώμα είναι πορτοκαλί!"),
Ουράνιο τόξο:: Κίτρινο => println!("Το χρώμα είναι κίτρινο!"),
Ουράνιο τόξο:: Πράσινο => println!("Το χρώμα είναι πράσινο!"),
Ουράνιο τόξο:: Μπλε => println!("Το χρώμα είναι μπλε!"),
Rainbow:: Indigo => println!("Το χρώμα είναι indigo!"),
Ουράνιο τόξο:: Βιολετί => println!("Το χρώμα είναι βιολετί!"),
}
}
στκύριος() {
αφήνω χρώμα = Ουράνιο τόξο:: Μπλε;
print_color (χρώμα);
}
Μπορείτε να πάρετε παραλλαγές δεν κατασκευάζονται ποτέ ή παρόμοιες προειδοποιήσεις όταν θα προσπαθήσετε να εκτελέσετε τον παραπάνω κώδικα, επειδή οι άλλες παραλλαγές εκτός από την παραλλαγή Μπλε δεν κατασκευάστηκαν ποτέ σε αυτόν τον κώδικα. Έτσι, σε αυτήν την περίπτωση, μπορείτε με ασφάλεια να αγνοήσετε αυτές τις προειδοποιήσεις, καθώς είναι σκόπιμη.
ο print_color η συνάρτηση παίρνει μια παράμετρο χρώματος του τύπου Rainbow enum. Η δήλωση αντιστοίχισης ταιριάζει με το χρώμα από μια σουίτα χρωμάτων στα οποία έχετε πρόσβαση μέσω των ονομάτων των παραλλαγών. Και τέλος, το μήνυμα εκτυπώνεται με βάση το χρώμα που ταιριάζει.
Μπορείτε να χρησιμοποιήσετε την αντιστοίχιση μοτίβων για σύνθετες λειτουργίες, όπως πολλαπλές τιμές επιστροφής βάσει μιας συνθήκης.
στυπολογισμός_μήκους κύματος(χρώμα: Ουράνιο τόξο) -> u32 {
αγώνας χρώμα {
Ουράνιο τόξο:: Κόκκινο => 700,
Ουράνιο τόξο:: Πορτοκαλί => 590,
Ουράνιο τόξο:: Κίτρινο => 570,
Ουράνιο τόξο:: Πράσινο => 510,
Ουράνιο τόξο:: Μπλε => 475,
Rainbow:: Indigo => 445,
Ουράνιο τόξο:: Βιολετί => 400,
}
}
ο υπολογισμός_μήκους κύματος Η συνάρτηση παίρνει μια χρωματική παραλλαγή του τύπου Rainbow enum ως παράμετρο και επιστρέφει έναν ανυπόγραφο ακέραιο αριθμό 32 bit που είναι το μήκος κύματος του χρώματος που ταιριάζει με το μοτίβο.
Το Rust παρέχει επίσης δομές για τη δημιουργία προσαρμοσμένων τύπων
Τα Enum είναι εύχρηστα για τον καθορισμό προσαρμοσμένων τύπων για πολλές λειτουργίες, ειδικά σε περιπτώσεις όπου τα πεδία είναι γνωστά και συγκεκριμένα.
Το Rust παρέχει επίσης δομές που μπορείτε να χρησιμοποιήσετε για να δημιουργήσετε προσαρμοσμένους τύπους με πεδία με όνομα. Σε αντίθεση με τα enums, οι δομές σάς επιτρέπουν να ορίζετε πεδία διαφορετικών τύπων στα οποία μπορείτε να έχετε πρόσβαση και να τροποποιήσετε μεμονωμένα.