别名使用
数据可以进行多次不可变借用,但是在不可变借用的期间,原始数据不可进行可变借用。另 一方面,在同一时刻内只允许有一个可变借用。只有在可变引用离开作用域之后,原始 数据才可再次被借用。
1. struct Point { x: i32, y: i32, z: i32 }
3. fn main() {
4. let mut point = Point { x: 0, y: 0, z: 0 };
6. {
7. let borrowed_point = &point;
8. let another_borrow = &point;
10. // 通过引用和原始所有者来访问数据
11. println!("Point has coordinates: ({}, {}, {})",
12. borrowed_point.x, another_borrow.y, point.z);
14. // 报错!不能可变地借用 `point` ,因为现在它有不可变的借用。
15. //let mutable_borrow = &mut point;
16. // 试一试 ^ 取消此行注释。
18. // 此处再次使用被借用的值
19. println!("Point has coordinates: ({}, {}, {})", borrowed_point.x, another_borrow.y, point.z);
21. // 不可变引用离开作用域
22. }
24. {
25. let mutable_borrow = &mut point;
27. // 通过可变引用来改变数据
28. mutable_borrow.x = 5;
29. mutable_borrow.y = 2;
30. mutable_borrow.z = 1;
32. // 报错!不能不可变地借用 `point`,因为现在它有可变的借用。
33. //let y = &point.y;
34. // 试一试 ^ 取消此行注释。
36. // 报错!不能打印,因为 `println!` 会创建一个不可变引用。
37. //println!("Point Z coordinate is {}", point.z);
38. // 试一试 ^ 取消此行注释。
40. // 可以工作!可变引用可以作为不可变的传给 `println!`。
41. println!("Point has coordinates: ({}, {}, {})",
42. mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);
44. // 可变引用离开作用域
45. }
47. // 现在又可以不可变地借用 `point` 了。
48. let borrowed_point = &point;
49. println!("Point now has coordinates: ({}, {}, {})",
50. borrowed_point.x, borrowed_point.y, borrowed_point.z);
51. }
