• 可变性
    • 参见:

    可变性

    可变数据可以使用 &mut T 进行可变借用。这叫做可变引用mutable reference),并赋予了借用者读/写访问能力。相反,&T 通过不可变引用(immutable reference)来借用数据,借用者可以读数据而不能更改数据:

    1. #[allow(dead_code)]
    2. #[derive(Clone, Copy)]
    3. struct Book {
    4. // `&'static str` 是一个指向分配在只读内存区的字符串的引用
    5. author: &'static str,
    6. title: &'static str,
    7. year: u32,
    8. }
    9. // 此函数接受一个指向图书 Book 的引用
    10. fn borrow_book(book: &Book) {
    11. println!("I immutably borrowed {} - {} edition", book.title, book.year);
    12. }
    13. // 此函数接受一个指向可变的图书 Book 的引用,同时把年份 `year` 改为 2004 年
    14. fn new_edition(book: &mut Book) {
    15. book.year = 2014;
    16. println!("I mutably borrowed {} - {} edition", book.title, book.year);
    17. }
    18. fn main() {
    19. // 创建一个名为 `immutabook` 的不可变的图书 Book
    20. let immutabook = Book {
    21. // 字符串字面量拥有 `&'static str` 类型
    22. author: "Douglas Hofstadter",
    23. title: "Gödel, Escher, Bach",
    24. year: 1979,
    25. };
    26. // 创建一个 `immutabook` 的可变拷贝,命名为 `mutabook`
    27. let mut mutabook = immutabook;
    28. // 不可变地借用一个不可变对象
    29. borrow_book(&immutabook);
    30. // 不可变地借用一个可变对象
    31. borrow_book(&mutabook);
    32. // 借用一个可变对象作为可变类型
    33. new_edition(&mut mutabook);
    34. // 报错!不能借用一个不可变对象来充当可变类型
    35. new_edition(&mut immutabook);
    36. // 改正 ^ 注释掉此行
    37. }

    参见:

    static