| # Mutability |
| |
| Mutable data can be mutably borrowed using `&mut T`. This is called |
| a *mutable reference* and gives read/write access to the borrower. |
| In contrast, `&T` borrows the data via an immutable reference, and |
| the borrower can read the data but not modify it: |
| |
| ```rust,editable,ignore,mdbook-runnable |
| #[allow(dead_code)] |
| #[derive(Clone, Copy)] |
| struct Book { |
| // `&'static str` is a reference to a string allocated in read only memory |
| author: &'static str, |
| title: &'static str, |
| year: u32, |
| } |
| |
| // This function takes a reference to a book |
| fn borrow_book(book: &Book) { |
| println!("I immutably borrowed {} - {} edition", book.title, book.year); |
| } |
| |
| // This function takes a reference to a mutable book and changes `year` to 2014 |
| fn new_edition(book: &mut Book) { |
| book.year = 2014; |
| println!("I mutably borrowed {} - {} edition", book.title, book.year); |
| } |
| |
| fn main() { |
| // Create an immutable Book named `immutabook` |
| let immutabook = Book { |
| // string literals have type `&'static str` |
| author: "Douglas Hofstadter", |
| title: "Gödel, Escher, Bach", |
| year: 1979, |
| }; |
| |
| // Create a mutable copy of `immutabook` and call it `mutabook` |
| let mut mutabook = immutabook; |
| |
| // Immutably borrow an immutable object |
| borrow_book(&immutabook); |
| |
| // Immutably borrow a mutable object |
| borrow_book(&mutabook); |
| |
| // Borrow a mutable object as mutable |
| new_edition(&mut mutabook); |
| |
| // Error! Cannot borrow an immutable object as mutable |
| new_edition(&mut immutabook); |
| // FIXME ^ Comment out this line |
| } |
| ``` |
| |
| ### See also: |
| |
| [`static`][static] |
| |
| [static]: ../lifetime/static_lifetime.md |