Διαδρομές
/
Rust
Rust
/
Ασκήσεις
/
Μακροεντολές
Μακροεντολές

Μακροεντολές

Δύσκολο

Οδηγίες

Οι μακροεντολές είναι ένα ισχυρό κομμάτι της εργαλειοθήκης κάθε προγραμματιστή Rust, και οι μακροεντολές με παραδείγματα είναι ένας σχετικά απλός τρόπος να αποκτήσεις αυτή τη δύναμη. Ας γράψουμε μία!

Πλαίσιο

Τι είναι μια μακροεντολή; Η Wikipedia την περιγράφει ως εξής:

Μια μακροεντολή (συντομογραφία του "macroinstruction", από την ελληνική λέξη μακρός, που σημαίνει "μακρύς") στην επιστήμη των υπολογιστών είναι ένας κανόνας ή ένα μοτίβο που ορίζει πώς μια συγκεκριμένη ακολουθία εισόδου (συχνά μια ακολουθία χαρακτήρων) αντιστοιχίζεται σε μια ακολουθία εξόδου αντικατάστασης (επίσης συχνά μια ακολουθία χαρακτήρων) σύμφωνα με μια καθορισμένη διαδικασία. Η διαδικασία αντιστοίχισης που υλοποιεί (μετασχηματίζει) μια χρήση μακροεντολής σε μια συγκεκριμένη ακολουθία είναι γνωστή ως επέκταση μακροεντολής.

Διαφωτιστικό! Αλλά για να γίνουμε πιο συγκεκριμένοι, οι μακροεντολές είναι ένα ειδικό συντακτικό που σου επιτρέπει να παράγεις κώδικα σε χρόνο μεταγλώττισης. Οι μακροεντολές μπορούν να χρησιμοποιηθούν για υπολογισμούς σε χρόνο μεταγλώττισης, αλλά πιο συχνά είναι απλώς ένας ακόμη τρόπος να αφαιρέσεις λεπτομέρειες από τον κώδικα σου. Για παράδειγμα, πιθανότατα έχεις χρησιμοποιήσει ήδη τις println!() και vec![]. Κάθε μία δέχεται οσοδήποτε πλήθος ορισμάτων, οπότε δεν μπορείς να τις εκφράσεις ως απλές συναρτήσεις. Από την άλλη, πάντα επεκτείνονται σε κάποια ποσότητα απολύτως τυπικού κώδικα Rust. Αν σε ενδιαφέρει, μπορείς να χρησιμοποιήσεις την υποεντολή cargo expand για να δεις τα αποτελέσματα της επέκτασης μακροεντολών στον κώδικα σου.

Για περισσότερες πληροφορίες σχετικά με τις μακροεντολές στη Rust, το Βιβλίο της Rust έχει ένα καλό κεφάλαιο γι' αυτές.

Εκφώνηση

Μπορείς να παράγεις ένα Vec αυθαίρετου μήκους μέσα στον κώδικα χρησιμοποιώντας τη μακροεντολή vec![]. Ωστόσο, η Rust δεν παρέχει τρόπο να παράγεις ένα HashMap μέσα στον κώδικα. Διόρθωσε αυτό γράφοντας μια μακροεντολή hashmap!().

Για παράδειγμα, ένας χρήστης της βιβλιοθήκης σου θα μπορούσε να γράψει hashmap!('a' => 3, 'b' => 11, 'z' => 32). Αυτό θα πρέπει να επεκταθεί στον παρακάτω κώδικα:

{
   let mut hm = HashMap::new();
   hm.insert('a', 3);
   hm.insert('b', 11);
   hm.insert('z', 32);
   hm
}

Σημείωσε ότι το crate maplit παρέχει μια μακροεντολή που λύνει τέλεια αυτή την άσκηση. Υλοποίησε τη δική σου λύση αντί να χρησιμοποιήσεις αυτό το crate· κάνε πρώτα μια προσπάθεια μόνος σου, πριν δεις τον πηγαίο κώδικα του.


Πηγή

Peter Goodspeed-Niklaus
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Rust Exercism

Έτοιμος να ξεκινήσεις την άσκηση Μακροεντολές;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Rust με 99 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.