Το Rust χρησιμοποιεί έναν ελεγκτή δανεισμού για να επιβάλει τους κανόνες ιδιοκτησίας του και να διασφαλίσει ότι τα προγράμματα είναι ασφαλή στη μνήμη. Οι κανόνες ιδιοκτησίας υπαγορεύουν πώς η Rust διαχειρίζεται τη μνήμη πάνω από τη στοίβα και το σωρό.
Καθώς γράφετε προγράμματα Rust, θα χρειαστεί να χρησιμοποιήσετε μεταβλητές χωρίς να αλλάξετε την ιδιοκτησία της σχετικής τιμής. Το Rust παρέχει έναν ισχυρό μηχανισμό δανεισμού για να ενθαρρύνει την ευελιξία και την επαναχρησιμοποίηση του κώδικα.
Τι είναι ο δανεισμός στη σκουριά;
Δανεισμός είναι η πρόσβαση στην τιμή μιας μεταβλητής χωρίς αναλαμβάνοντας την κυριότητα της μεταβλητής με αναφορά στον ιδιοκτήτη. Ο έλεγχος δανεισμού διασφαλίζει ότι η αναφορά είναι έγκυρη και ότι τα δεδομένα δεν απορρίπτονται χρησιμοποιώντας μια κατασκευή που ονομάζεται διάρκεια ζωής.
Μια διάρκεια ζωής είναι πόσο καιρό υπάρχει μια μεταβλητή. Οι διάρκειες ζωής ξεκινούν με τη δημιουργία μεταβλητών και τελειώνουν με την καταστροφή μεταβλητών. Μπορείτε να δανειστείτε την ιδιοκτησία μιας μεταβλητής και όταν η δανεισμένη αναφορά είναι εκτός πεδίου εφαρμογής, η ιδιοκτησία επιστρέφει στη μεταβλητή ιδιοκτήτη. Ο δανεισμός μοιάζει λίγο με το
δείκτες που θα βρείτε σε γλώσσες όπως η C++ και η Go. Αλλά ο μεταγλωττιστής Rust χρησιμοποιεί τον έλεγχο δανεισμού για να διασφαλίσει ότι τα προγράμματα είναι ασφαλή στη μνήμη.Ένα παράδειγμα δανεισμού στη σκουριά
Μπορείτε να δανειστείτε την κυριότητα μιας μεταβλητής αναφέροντας τον κάτοχο χρησιμοποιώντας το σύμβολο σύμβολο (&).
στκύριος() {
αφήνω x = Σειρά::from("γεια"); // x κατέχει "γεια"
αφήνω y = &x; // y αναφορές x, δανείζεται "γεια"
println!("{}", Χ);
println!("{}", y)
}
Χωρίς δανεισμό με αναφορά, το πρόγραμμα θα πανικοβληθεί. Θα παραβίαζε τον κανόνα ιδιοκτησίας ότι μια τιμή μπορεί να έχει έναν κάτοχο και δύο μεταβλητές δεν μπορούν να δείχνουν την ίδια θέση μνήμης. Ο δανεισμός μπορεί να είναι πολύ χρήσιμος σε λειτουργίες. Ακολουθεί ένα παράδειγμα δανεισμού σε μια συνάρτηση, για να διατηρήσετε την ιδιοκτησία ενώ καλείτε άλλες συναρτήσεις που λαμβάνουν τοπικές μεταβλητές ως ορίσματα.
στεκτύπωση_ακόμα(διάνυσμα: &Vec<i32>) {
Για αξίες σε διάνυσμα {
αν αξίες % 2 == 0 {
println!("{}", αξίες);
}
}
}
ο εκτύπωση_ακόμα Η συνάρτηση αναφέρει ως όρισμα ένα διάνυσμα ακεραίων 32-bit. Στη συνέχεια εκτυπώνει γραμμές τιμών που είναι πολλαπλάσια του δύο στο διάνυσμα χρησιμοποιώντας έναν βρόχο for και το println! μακροεντολή.
στκύριος() {
αφήνω αριθμός_διάνυσμα = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&number_vector); // η ιδιοκτησία δανείζεται, δεν μετακινείται
println!("Η κύρια συνάρτηση διατηρεί την ιδιοκτησία του διανύσματος αριθμού{:?}", αριθμός_διάνυσμα)
}
Η κύρια συνάρτηση δηλώνει τη μεταβλητή number_vector και της εκχωρεί ένα διάνυσμα ακεραίων 32 bit. Στη συνέχεια καλεί τη συνάρτηση print_even και της μεταβιβάζει μια αναφορά στο αριθμός_διάνυσμα μεταβλητή χρησιμοποιώντας το σύμβολο σύμβολο.
Η κύρια λειτουργία διατηρεί την ιδιοκτησία του αριθμός_διάνυσμα μεταβλητή μπορεί να συνεχίσει να χρησιμοποιεί την τιμή στη θέση μνήμης του.
Αναφορές δανεισμού και μετάλλαξης
Οι συναρτήσεις μπορούν επίσης να τροποποιήσουν τις δανεισμένες μεταβλητές χρησιμοποιώντας μεταβλητές αναφορές σε αυτές, πριν επιστρέψουν την ιδιοκτησία.
Ωστόσο, σε αντίθεση με τις κανονικές μεταβλητές που μπορούν να ρυθμιστούν σε mutable χρησιμοποιώντας τη λέξη-κλειδί mut, πρέπει να προσαρτήσετε τις μεταβλητές αναφορές με το σύμβολο συμπλεκτικού.
Πριν κάνετε μεταβλητές αναφορές, η μεταβλητή που θέλετε να τροποποιήσετε πρέπει να είναι μεταβλητή.
στremove_value(διάνυσμα: &mutVec<i32>) -> &Vec<i32> {
vectr.remove(4);
ΕΠΙΣΤΡΟΦΗ διάνυσμα
}
ο remove_value Η συνάρτηση λαμβάνει την αναφορά ενός μεταβλητού διανύσματος ακέραιων αριθμών 32 bit. Επιστρέφει ένα διάνυσμα ακεραίων 32-bit μετά την αφαίρεση της τιμής του διανύσματος στον τέταρτο δείκτη.
στκύριος() {
αφήνωmut αριθμοί = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
remove_value(&mut αριθμοί)· // μεταβλητή αναφορά εδώ
println!("{:?}", nums);
}
Η συνάρτηση τροποποιεί το αριθμοί διάνυσμα καλώντας remove_value και μεταβιβάζοντας τη μεταβλητή αναφορά ενός διανύσματος ως όρισμα. Κατά την εκτύπωση του διανύσματος, ο προηγούμενος τέταρτος δείκτης του διανύσματος δεν υπάρχει.
Παρατηρήστε ότι το όρισμα είναι μια αναφορά σε ένα μεταβλητό διάνυσμα.
Είναι σημαντικό να κατανοήσετε την ιδιοκτησία και τον δανεισμό
Θα χρειαστεί να κατανοήσετε την ιδιοκτησία και τον δανεισμό για να γράψετε αποτελεσματικό, ασφαλή στη μνήμη κώδικα Rust που μεταγλωττίζεται και εκτελείται. Εάν ο κωδικός σας δεν ακολουθεί τους κανόνες ιδιοκτησίας, ο ελεγκτής δανείου θα τον εντοπίσει. Θα χρειαστεί να κάνετε το πρόγραμμά σας ασφαλές στη μνήμη για να το μεταγλωττίσει το Rust.
Ο ελεγκτής δανείου είναι ενοχλητικός όταν είστε νέοι στο Rust. Αλλά, καθώς γράφετε περισσότερο κώδικα Rust, θα το συνηθίσετε και θα αποκτήσετε εμπειρία στη σύνταξη κώδικα Rust που είναι ασφαλής για μνήμη.