E0597 — DedSec Project
Rust E0597 — δανεισμένη τιμή που δεν ζει αρκετά Μη έγκυρη διάρκεια ζωής Ένα reference δεν μπορεί να ζει περισσότερο από τον owner. Αν μια συνάρτηση επιστρέψει pointer προς δικό της…
Rust E0597 — δανεισμένη τιμή που δεν ζει αρκετά
Μη έγκυρη διάρκεια ζωής
Ένα reference δεν μπορεί να ζει περισσότερο από τον owner. Αν μια συνάρτηση επιστρέψει pointer προς δικό της προσωρινό String, η μνήμη δεν παραμένει έγκυρη μετά την επιστροφή. Τα lifetime annotations δεν παρατείνουν τη ζωή των δεδομένων.
// fn broken<'a>() -> &'a str {
// let local = String::from("temporary");
// &local // αναφορά προς κατεστραμμένη τιμή
// }
fn owned() -> String {
String::from("persistent")
}
fn main() {
let text = owned();
let view: &str = &text;
assert_eq!(view, "persistent");
}
Δανείσου από τον caller
Αν η έξοδος πρέπει να παραπέμπει σε υπάρχον argument, δήλωσε αυτή τη σχέση:
fn first_word(input: &str) -> &str {
input.split_whitespace().next().unwrap_or("")
}
Το &str ισχύει μόνο όσο υπάρχει το αρχικό input. Αν ο caller χρειάζεται την τιμή μετά το τέλος του input, πρέπει να πάρει owned String.
Πείραμα
Κάλεσε first_word από long-lived String και προσπάθησε να κρατήσεις borrow έξω από το scope. Δες diagnostic και άλλαξε API, όχι την παράμετρο σε πλαστό static lifetime. Δοκίμασε και struct που αποθηκεύει borrowed view ή owned String.
Πηγή: https://doc.rust-lang.org/error_codes/E0597.html
Lifetime ως σχέση ανάμεσα στα δεδομένα
Δοκίμασε με τη συνάρτηση first_word τα "", "Ada Lovelace" και " Alan"· οι αναμενόμενες τιμές είναι "", "Ada" και "Alan". Ο επιστρεφόμενος &str δεν αποθηκεύει νέο κείμενο: δείχνει σε κομμάτι της εισόδου. Αν θες να βάλεις την πρώτη λέξη σε cache η οποία ζει μετά τη διαγραφή του input, μετέτρεψε το αποτέλεσμα σε String μέσω .to_owned(). Ένα string literal μπορεί να έχει 'static lifetime, αλλά η αναφορά σε δυναμικό String όχι. Μη χρησιμοποιείς πλασματικό 'static annotation για να σβήσεις το diagnostic: δεν δεσμεύει νέα μνήμη και δεν μεταβάλλει τον πραγματικό owner.