1.8 - זמני חיים בחתימות ובמבנים - פתרון
פתרון יחס מפורש למקור¶
המבנה מכיל רק הפניות, ולכן חייב להיות לו פרמטר זמן חיים. הפונקציה בבעלות יוצרת טקסט עצמאי, ובכך משנה את חוזה התוצאה.
struct Pair<'a> {
key: &'a str,
value: &'a str,
}
fn parse(line: &str) -> Option<Pair<'_>> {
let (key, value) = line.split_once('=')?;
if key.is_empty() || value.is_empty() {
return None;
}
Some(Pair { key, value })
}
fn owned_key(line: &str) -> Option<String> {
Some(parse(line)?.key.to_owned())
}
fn main() {
let line = String::from("name=worker");
let pair = parse(&line).unwrap();
println!("{}={}", pair.key, pair.value);
let independent = {
let temporary = String::from("mode=fast");
owned_key(&temporary).unwrap()
};
println!("{independent}");
}
הדוגמה הבאה נבדקת בנפרד ונועדה להידחות:
fn main() {
let borrowed;
{
let source = String::from("temporary");
borrowed = source.as_str();
}
println!("{borrowed}");
}
הפניה אינה בעלים ואינה משאירה את source בחיים. בגרסת owned_key הועתקו בייטים ל־String חדשה, ולכן התוצאה אינה תלויה במקור. הפתרון אינו עוקף בדיקת זמן חיים; הוא יוצר חיי נתונים אחרים שאכן תומכים בשימוש המבוקש.