DedSec Project

E0382 — DedSec Project

Rust E0382 — χρήση δεδομένων μετά το move Παρακολούθησε τον owner Ένα String συνήθως μεταφέρεται όταν περνά by value. Το αρχικό binding παύει να το κατέχει και δεν επιτρέπεται η χρήση του…

Rust E0382 — χρήση δεδομένων μετά το move

Παρακολούθησε τον owner

Ένα String συνήθως μεταφέρεται όταν περνά by value. Το αρχικό binding παύει να το κατέχει και δεν επιτρέπεται η χρήση του. Ο compiler αποκλείει αυτό το σφάλμα ήδη στο compile.

fn consume(text: String) -> usize { text.len() }

fn main() {
    let message = String::from("hello");
    // let size = consume(message); println!("{}", message); // E0382
    let size = consume(message.clone());
    assert_eq!(size, 5);
    assert_eq!(message, "hello");
}

Χρειάζεται πράγματι αντιγραφή;

Το clone δημιουργεί δεύτερο String με allocation. Αν μια συνάρτηση μόνο διαβάζει, χρησιμοποίησε borrow slice:

fn measure(text: &str) -> usize { text.len() }

fn check() {
    let original = String::from("hello");
    assert_eq!(measure(&original), 5);
    assert_eq!(original, "hello");
}

Πείραμα

Ενεργοποίησε τη λανθασμένη ακολουθία και δες E0382 με cargo check. Σύγκρινε String με i32 που έχει Copy. Σχεδίασε ποιος κατέχει τιμή μετά από κάθε statement. Αν ο callee χρειάζεται ownership, επανασχεδίασε τη μεταφορά ή την επιστροφή του αντί να προσθέτεις clone παντού.

Πηγή: https://doc.rust-lang.org/error_codes/E0382.html

Πρόσθετος έλεγχος: ownership δεν σημαίνει σωστό αποτέλεσμα

Φτιάξε fn length(text: &str) -> usize { text.len() } και κάλεσέ την δύο φορές με &message· το αρχικό String παραμένει διαθέσιμο. Έπειτα σύγκρινε "é".len() με "é".chars().count(): το πρώτο μετρά bytes UTF-8 και το δεύτερο Unicode scalar values. Η Rust μπορεί να αποδείξει σωστό borrowing, όχι ότι διάλεξες σωστή μονάδα μέτρησης. Για ουρά που πρέπει να κρατήσει το μήνυμα, η μεταφορά ownership είναι θεμιτή και η χρήση της παλιάς μεταβλητής πρέπει να απαγορεύεται. Κατέγραψε τρεις ξεχωριστές λύσεις: borrow για ανάγνωση, move για αλλαγή ιδιοκτήτη, clone μόνο όταν απαιτείται αντίγραφο.