לדלג לתוכן

פתרון זהות מתארים

הקוד הבא מחליף את main בדוגמת ההרצאה ומוסיף את Seek ואת SeekFrom לרשימת ה־imports. התוצאה ממחישה שיתוף מצב של פתיחה אחת.

use std::io::{Seek, SeekFrom};
fn main() -> io::Result<()> {
    let mut first = File::open("letters.txt")?;
    let mut duplicate = first.try_clone()?;
    let mut independent = File::open("letters.txt")?;
    first.seek(SeekFrom::Start(4))?;
    let mut shared = [0; 2];
    let mut separate = [0; 2];
    duplicate.read_exact(&mut shared)?;
    independent.read_exact(&mut separate)?;
    assert_eq!(&shared, b"ef");
    assert_eq!(&separate, b"ab");
    Ok(())
}
fn transfer(fd: OwnedFd) -> File { File::from(fd) }

הפונקציה transfer צורכת את הבעלות הישנה ומחזירה בעלים חדש. הפונקציה report מההרצאה מקבלת השאלה בלבד. במקרה של מיחזור מספר, הקרנל אינו יודע שהמספר נשמר אצלנו עבור שימוש היסטורי אחר, ולכן פעולה על המספר החדש יכולה להצליח ולהשפיע על אובייקט שונה לחלוטין.