• 借用

    借用

    多数情况下,我们更希望访问数据本身而不需要取得它的所有权。为实现这点,Rust 使用了借用borrowing)机制。对象可以通过引用(&T)来传递,从而取代通过值(T)来传递。

    编译器静态地保证了(通过借用检查器)引用总是always)指向有效的对象。也就是说,当存在引用指向一个对象时,该对象不能被销毁。

    1. // 此函数拥有 box 的所有权并销毁它
    2. fn eat_box_i32(boxed_i32: Box<i32>) {
    3. println!("Destroying box that contains {}", boxed_i32);
    4. }
    5. // 此函数借用了一个 i32 类型
    6. fn borrow_i32(borrowed_i32: &i32) {
    7. println!("This int is: {}", borrowed_i32);
    8. }
    9. fn main() {
    10. // 创建一个装箱的 i32 类型,以及一个存在栈中的 i32 类型。
    11. let boxed_i32 = Box::new(5_i32);
    12. let stacked_i32 = 6_i32;
    13. // 借用了 box 的内容,但没有取得所有权,所以 box 的内容可以
    14. // 再次借用。
    15. borrow_i32(&boxed_i32);
    16. borrow_i32(&stacked_i32);
    17. {
    18. // 给出一个指向 box 里面所包含数据的引用
    19. let _ref_to_i32: &i32 = &boxed_i32;
    20. // 报错!
    21. // 当 `boxed_i32` 里面的值被借用时,不能销毁 `boxed_int`。
    22. eat_box_i32(boxed_i32);
    23. // 改正 ^ 注释掉此行
    24. // `_ref_to_i32` 离开作用域且不再被借用。
    25. }
    26. // box 现在可以放弃 `eat_i32` 的所有权且可以销毁
    27. eat_i32(boxed_i32);
    28. }