לדלג לתוכן

2.8 - בעלות משותפת ושינוי פנימי - פתרון

פתרון סיום ההרשאה לפני callback

ה־callback הוא קוד חיצוני מבחינת הפונקציה. אין להחזיק הרשאה בלעדית שאינה נדרשת במהלך הקריאה אליו, אם החוזה מאפשר לו לגשת שוב לאוסף.

use std::cell::RefCell;

fn update<F: FnOnce()>(values: &RefCell<Vec<u32>>, callback: F) {
    {
        let mut access = values.borrow_mut();
        access.push(7);
    }
    callback();
}

fn main() {
    let values = RefCell::new(Vec::new());
    {
        let mut access = values.borrow_mut();
        access.push(1);
        assert!(values.try_borrow().is_err());
    }
    update(&values, || {
        assert_eq!(values.borrow().len(), 2);
    });
}

הכשל בדוגמה הראשונה אינו data race; אין שני תהליכונים. הוא נובע משתי הרשאות גישה שאינן מתאימות לאותו זמן חיים. הקשר החלש של Weak מנהל את חיי הערך, ואילו RefCell מנהלת את הרשאות ההשאלה. שני המנגנונים פותרים שאלות שונות.