3.4 - בניית הפשטה בטוחה וסקירת חובות ההוכחה - פתרון
פתרון קצוות וחיי השאלה¶
הבדיקות הבאות מתווספות לקובץ שמגדיר את split_checked ואת Borrowed מן ההרצאה:
fn main() {
let mut values = [1, 2];
let (left, right) = split_checked(&mut values, 0).unwrap();
assert!(left.is_empty());
assert_eq!(right, [1, 2]);
let (left, right) = split_checked(&mut values, 2).unwrap();
assert_eq!(left, [1, 2]);
assert!(right.is_empty());
assert!(split_checked(&mut values, 3).is_none());
let mut units = [(); 4];
let (left, right) = split_checked(&mut units, 2).unwrap();
assert_eq!((left.len(), right.len()), (2, 2));
let mut text = String::from("hello");
{
let mut borrowed = Borrowed::new(&mut text);
borrowed.get_mut().push_str(" world");
assert_eq!(borrowed.get(), "hello world");
}
assert_eq!(text, "hello world");
}
התוצאות קשורות לזמן החיים של ההפניה הבלעדית שנמסרה לפונקציה. לכן שימוש מתחרה ב־values בזמן שפרוסה מוחזרת עדיין נחוצה יידחה. הבדיקה עם יחידות אינה מוכיחה את כל המקרים, אבל היא מונעת מן ההסבר להישען על הנחה שגויה שלכל איבר יש כתובת מספרית אחרת.