לדלג לתוכן

2.5 - הפשטות גנריות התלויות בזמן חיים - פתרון

פתרון תוצאה קשורה להשאלת המקור

המקור מחזיק את כל השורות, אבל הממשק שלו מגביל כל תוצאה להשאלה הנוכחית. ההעתקה בגרסת האיסוף יוצרת בעלות שאינה תלויה בהשאלה הזאת.

הוסיפו אחרי הגדרת LendingSource מההרצאה:

struct Lines { values: Vec<String>, position: usize }

impl LendingSource for Lines {
    type Item<'a> = &'a str;
    fn next<'a>(&'a mut self) -> Option<&'a str> {
        let line = self.values.get(self.position)?;
        self.position += 1;
        Some(line)
    }
}

fn with_packet<F>(callback: F) -> usize
where F: for<'a> FnOnce(&'a [u8]) -> usize {
    let packet = [1u8, 2, 3];
    callback(&packet)
}

fn main() {
    let mut lines = Lines { values: vec!["a".into(), "b".into()], position: 0 };
    let mut owned = Vec::new();
    while let Some(line) = lines.next() { owned.push(line.to_owned()); }
    assert_eq!(owned, ["a", "b"]);
    assert_eq!(with_packet(|packet| packet.len()), 3);
}

ההפניה הראשונה מפסיקה להיות נחוצה לאחר יצירת String בבעלות, ולכן הקריאה הבאה מותרת. החזרת usize מ־with_packet אינה מוציאה הפניה למאגר; היא מחזירה ערך עצמאי. דוגמת שתי השאלות נכשלת מאותן סיבות שהודגמו במקור Chunks.