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:
#[allow(dead_code)]#[derive(Clone, Copy)]struct Book {// `&'static str` is a reference to a string allocated in read only memoryauthor: &'static str,title: &'static str,year: u32,}// This function takes a reference to a bookfn 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 2014fn 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 objectborrow_book(&immutabook);// Immutably borrow a mutable objectborrow_book(&mutabook);// Borrow a mutable object as mutablenew_edition(&mut mutabook);// Error! Cannot borrow an immutable object as mutablenew_edition(&mut immutabook);// FIXME ^ Comment out this line}