可变性

可变数据可以使用 &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` 改为 2014 年
  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