• 别名使用

    别名使用

    数据可以进行多次不可变借用,但是在不可变借用的期间,原始数据不可进行可变借用。也就是说,在同一段时间内只允许单独一个可变借用。原始数据在可变引用离开作用域之后可再次被借用。

    1. struct Point { x: i32, y: i32, z: i32 }
    2. fn main() {
    3. let mut point = Point { x: 0, y: 0, z: 0 };
    4. {
    5. let borrowed_point = &point;
    6. let another_borrow = &point;
    7. // 通过引用和原始所有者来访问数据
    8. println!("Point has coordinates: ({}, {}, {})",
    9. borrowed_point.x, another_borrow.y, point.z);
    10. // 报错!不能借用 `point` 作为可变内容,因为目前已被借用成为
    11. // 不可变内容。
    12. //let mutable_borrow = &mut point;
    13. // 动手试一试 ^ 将此行注释去掉。
    14. // 不可变引用离开作用域
    15. }
    16. {
    17. let mutable_borrow = &mut point;
    18. // 通过可变引用来改变数据
    19. mutable_borrow.x = 5;
    20. mutable_borrow.y = 2;
    21. mutable_borrow.z = 1;
    22. // 报错!不能借用 `point` 作为不可变内容,因为目前它已被借用成为
    23. // 可变内容。
    24. //let y = &point.y;
    25. // 动手试一试 ^ 将此行注释去掉。
    26. // 报错!不能打印,因为 `println!` 接受了一个不可变引用。
    27. //println!("Point Z coordinate is {}", point.z);
    28. // 动手试一试 ^ 将此行注释去掉。
    29. // 好!可变引用可以作为不可变的传给 `println!`。
    30. println!("Point has coordinates: ({}, {}, {})",
    31. mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);
    32. // 可变引用离开作用域
    33. }
    34. // `point` 的不可变引用再次可用。
    35. let borrowed_point = &point;
    36. println!("Point now has coordinates: ({}, {}, {})",
    37. borrowed_point.x, borrowed_point.y, borrowed_point.z);
    38. }