## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# 可变性

可变数据可以使用 `&mut T` 进行可变借用。这被称为可变引用，并给予借用者读写访问权。相比之下，`&T` 通过不可变引用借用数据，借用者可以读取数据但不能修改它：

    #[allow(dead_code)]
    #[derive(Clone, Copy)]
    struct Book {
        // `&'static str` 是对分配在只读内存中的字符串的引用
        author: &'static str,
        title: &'static str,
        year: u32,
    }

    // 此函数接受一个对 Book 类型的引用
    fn borrow_book(book: &Book) {
        println!("我不可变地借用了《{}》- {} 版", book.title, book.year);
    }

    // 此函数接受一个对可变 Book 的引用，并将 `year` 改为 2014
    fn new_edition(book: &mut Book) {
        book.year = 2014;
        println!("我可变地借用了《{}》- {} 版", book.title, book.year);
    }

    fn main() {
        // 创建一个名为 `immutabook` 的不可变 Book 实例
        let immutabook = Book {
            // 字符串字面量的类型是 `&'static str`
            author: "Douglas Hofstadter",
            title: "哥德尔、埃舍尔、巴赫",
            year: 1979,
        };

        // 创建 `immutabook` 的可变副本，并命名为 `mutabook`
        let mut mutabook = immutabook;

        // 不可变地借用一个不可变对象
        borrow_book(&immutabook);

        // 不可变地借用一个可变对象
        borrow_book(&mutabook);

        // 可变地借用一个可变对象
        new_edition(&mut mutabook);

        // 错误！不能将不可变对象作为可变对象借用
        new_edition(&mut immutabook);
        // 修复：^ 注释掉此行
    }

### 另请参阅：

`static`