Co

Collect σε Rust

{one: "1 άσκηση", other: "%{count} ασκήσεις"}

Σχετικά με την έννοια Collect

Για να κατανοήσεις τη συνάρτηση collect, είναι σημαντικό να γνωρίζεις ότι χρησιμοποιείται για να μετατρέψει έναν επαναλήπτη σε συλλογή. Θυμήσου ότι ένας επαναλήπτης είναι μια ακολουθία στοιχείων που μπορεί να συνδεθεί με άλλους επαναλήπτες. Οι επαναλήπτες είναι οκνηροί, που σημαίνει ότι δεν εκτελούνται μέχρι να καλέσεις κώδικα που καταναλώνει τον επαναλήπτη. Τέτοιος κώδικας περιλαμβάνει βρόχους for και καταναλωτικούς προσαρμογείς. Οι καταναλωτικοί προσαρμογείς επεξεργάζονται όλα τα στοιχεία του επαναλήπτη για να παράξουν κάποιου είδους έξοδο.

Το collect είναι ένας τέτοιος καταναλωτικός προσαρμογέας, που μπορεί να χρησιμοποιηθεί για να παράξει ένα στιγμιότυπο οποιουδήποτε τύπου υλοποιεί το χαρακτηριστικό FromIterator. Αυτό το χαρακτηριστικό υλοποιείται για όλες τις συλλογές της τυπικής βιβλιοθήκης. Επειδή το FromIterator υλοποιείται για πολλούς τύπους, πρέπει να ενημερώσεις τη Rust για το είδος της συλλογής που επιθυμείς. Για παράδειγμα, αν θέλουμε ένα Vec<char> από ένα τμήμα συμβολοσειράς, θα μπορούσαμε να εισάγουμε τον τύπο στην κλήση μας στο collect ως εξής

    let my_chars = "Hello, World!".chars().collect::<Vec<char>>();
// since the item type of the `String::chars()` iterator can be inferred to be `char`, we can omit that information
// let my_chars = "Hello, World!".chars().collect::<Vec<_>>();

Οι διπλές άνω τελείες και οι εξωτερικές γωνιακές αγκύλες (δηλ. ::<_>) είναι γνωστές ως turbofish. Σε αυτή την περίπτωση, το turbofish είναι πιο θορυβώδης σύνταξη από ό,τι χρειαζόμαστε. Καθορίζοντας τον τύπο στην ίδια τη δέσμευση, το collect μπορεί να συμπεράνει ποια συλλογή πρέπει να δημιουργήσει με λιγότερο συντακτικό θόρυβο.

    let my_chars: Vec<char> = "Hello, World!".chars().collect();
// or
// let my_chars: Vec<_> = "Hello, World!".chars().collect();

Αν θέλαμε ένα String με ανεστραμμένους χαρακτήρες, θα μπορούσαμε να το κάνουμε ως εξής

    let rev_chars: String = "Hello, World!".chars().rev().collect();

Η συμπερασματολογία τύπων της Rust είναι αρκετά ισχυρή ώστε μερικές φορές να μη χρειαζόμαστε ρητή ενσωματωμένη σημείωση:

fn get_reversed_chars(phrase: &str) -> Vec<char> {
    phrase.chars().rev().collect()
}

Ο τύπος επιστροφής της συνάρτησης get_reversed_chars επιτρέπει στη συνάρτηση collect να συμπεράνει ποια συλλογή θα επιστρέψει. Εδώ, όμως, πρέπει να καθορίσουμε το Vec<char> και όχι το Vec<_>, καθώς η Rust δεν εκτελεί συμπερασματολογία τύπων για υπογραφές συναρτήσεων. Αυτό γίνεται για να διασφαλιστεί ότι κάποιος που διαβάζει τον κώδικα μπορεί γρήγορα να γνωρίζει ποιους τύπους καταναλώνει και επιστρέφει μια συνάρτηση.

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