לדלג לתוכן

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 חדשה, ולכן התוצאה אינה תלויה במקור. הפתרון אינו עוקף בדיקת זמן חיים; הוא יוצר חיי נתונים אחרים שאכן תומכים בשימוש המבוקש.