Οι πλειάδες είναι ένας ελαφρύς τρόπος να ομαδοποιείς ένα σταθερό σύνολο δεδομένων αυθαίρετων τύπων. Μια πλειάδα δεν έχει κάποιο συγκεκριμένο όνομα. Όταν δίνεις όνομα σε μια δομή δεδομένων, αυτή γίνεται struct. Τα πεδία μιας πλειάδας δεν έχουν ονόματα. Η πρόσβαση σε αυτά γίνεται με αποδόμηση ή με βάση τη θέση τους.
Οι πλειάδες δημιουργούνται πάντα με μια έκφραση πλειάδας:
// pointless but legal
let unit = ();
// single element
let single_element = ("note the comma",);
// two element
let two_element = (123, "elements can be of differing types");
Οι πλειάδες μπορούν να έχουν οποιονδήποτε αριθμό στοιχείων.
Μπορείς να έχεις πρόσβαση στα στοιχεία μιας πλειάδας με αποδόμηση. Αυτό σημαίνει απλώς ότι αναθέτεις ονόματα μεταβλητών στα επιμέρους στοιχεία της πλειάδας, καταναλώνοντάς την.
let (elem1, _elem2) = two_element;
assert_eq!(elem1, 123);
Μπορείς επίσης να έχεις πρόσβαση στα στοιχεία μιας πλειάδας με βάση την αριθμητική θέση τους. Η αρίθμηση των θέσεων, όπως πάντα, ξεκινά από το 0.
let notation = single_element.0;
assert_eq!(notation, "note the comma");
Θα σου ζητηθεί επίσης να δουλέψεις με δομές πλειάδων. Όπως οι κανονικές δομές, είναι τύποι με όνομα. Σε αντίθεση με τις κανονικές δομές, όμως, έχουν ανώνυμα πεδία. Η σύνταξή τους μοιάζει πολύ με τη σύνταξη των κανονικών πλειάδων. Είναι νόμιμο να χρησιμοποιήσεις και αποδόμηση και πρόσβαση με βάση τη θέση.
struct TupleStruct(u8, i32);
let my_tuple_struct = TupleStruct(123, -321);
let neg = my_tuple_struct.1;
let TupleStruct(byte, _) = my_tuple_struct;
assert_eq!(neg, -321);
assert_eq!(byte, 123);
Όλα τα πεδία των ανώνυμων πλειάδων είναι πάντα δημόσια. Ωστόσο, τα πεδία των δομών πλειάδων έχουν ξεχωριστή ορατότητα, η οποία από προεπιλογή είναι ιδιωτική, ακριβώς όπως τα πεδία των κανονικών δομών. Μπορείς να κάνεις τα πεδία δημόσια με τον τροποποιητή pub, όπως ακριβώς σε μια κανονική δομή.
// fails due to private fields
mod tuple { pub struct TupleStruct(u8, i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
// succeeds: fields are public
mod tuple { pub struct TupleStruct(pub u8, pub i32); }
fn main() { let _my_tuple_struct = tuple::TupleStruct(123, -321); }
Δουλεύεις πάνω σε ένα παιχνίδι που προορίζεται για ένα ενσωματωμένο σύστημα χαμηλής κατανάλωσης και πρέπει να γράψεις μερικές βοηθητικές συναρτήσεις που θα χρησιμοποιηθούν από άλλα μέρη του παιχνιδιού.
Το πηλίκο είναι το αποτέλεσμα μιας διαίρεσης.
fn divmod(dividend: i16, divisor: i16) -> (i16, i16)
Παράδειγμα:
assert_eq!(divmod(10, 3), (3, 1));
Αυτό θα βοηθήσει να ενεργοποιήσεις μια βελτιστοποίηση του buffer οθόνης, όπως υπόσχεται το αφεντικό σου.
Οι iterator είναι στοιχεία που εκθέτουν τις μεθόδους που ορίζει το Iterator trait. Αυτή η τεκμηρίωση είναι αρκετά εκτενής, γιατί προσφέρουν πολλές μεθόδους. Ακολουθούν τα πιο σχετικά χαρακτηριστικά:
enumerate που επιστρέφει μια πλειάδα (i, val) για κάθε τιμήfilter που χρησιμοποιεί ένα closure για να καθορίσει αν θα αποδώσει ένα στοιχείο του iteratormap που χρησιμοποιεί ένα closure για να τροποποιήσει τα στοιχεία του iteratorΕπειδή η συνάρτησή σου μπορεί να τρέξει σε οποιοδήποτε είδος iterator, χρησιμοποιεί το impl για να δηλώσει ότι πρόκειται για ένα στιγμιότυπο ενός trait και όχι για ένα απλό στοιχείο. Παρομοίως, η σύνταξη <Item=T> σημαίνει απλώς ότι δεν έχει σημασία τι είδους στοιχείο παράγει ο iterator. Η συνάρτησή σου μπορεί να παράγει τα άρτια στοιχεία οποιουδήποτε iterator.
fn evens<T>(iter: impl Iterator<Item=T>) -> impl Iterator<Item=T>
Παραδείγματα:
let mut even_ints = evens(0_u8..);
assert_eq!(even_ints.next(), Some(0));
assert_eq!(even_ints.next(), Some(2));
assert_eq!(even_ints.next(), Some(4));
assert_eq!(even_ints.next(), Some(6));
let mut evens_from_odds = evens(1_i16..);
assert_eq!(evens_from_odds.next(), Some(1));
assert_eq!(evens_from_odds.next(), Some(3));
assert_eq!(evens_from_odds.next(), Some(5));
assert_eq!(evens_from_odds.next(), Some(7));
Για ευκολία στην αντιστοίχιση, έχεις ένα tuple struct Position:
struct Position(i16, i16);
Πρέπει να υλοποιήσεις μια μέθοδο manhattan στο Position που επιστρέφει την απόσταση manhattan αυτής της θέσης από την αρχή των αξόνων (Position(0, 0)).
impl Position {
fn manhattan(&self) -> i16
}
Παράδειγμα:
assert_eq!(Position(3, 4).manhattan(), 7);
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Rust με 99 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.