• 生命周期

    生命周期

    生命周期lifetime)是一个结构成分,编译器(也称为借用检查器)使用它来确保所有的借用都是有效的。确切地说,一个变量的生命周期在它创建的时候开始,在它销毁的时候结束。虽然命周期和作用域经常被一起提到,但它们并不相同。

    例如考虑这种情况,我们通过 & 来借用一个变量。该借用拥有一个生命周期,此生命周期由它声明的所在地方决定。因此,只要在出借者(lender)被销毁前结束,借用都是有效的。而借用的作用域是由使用引用的位置决定的。

    在下面的例子和本章节剩下的内容里,我们将看到生命周期和作用域的联系与区别。

    1. // 下面使用连线来标注各个变量的生命周期的创建和销毁。
    2. // `i` 的生命周期最长,因为它的作用域完全覆盖了 `borrow1` 和
    3. // `borrow2` 两者。`borrow1` 和 `borrow2` 的周期没有关联,
    4. // 因为它们各不相交。
    5. fn main() {
    6. let i = 3; // `i` 的生命周期开始。─────────────────────┐
    7. // │
    8. { // │
    9. let borrow1 = &i; // `borrow1` 的生命周期开始。 ──┐│
    10. // ││
    11. println!("borrow1: {}", borrow1); // ││
    12. } // `borrow1` 结束。─────────────────────────────────┘│
    13. // │
    14. // │
    15. { // │
    16. let borrow2 = &i; // `borrow2` 生命周期开始。─────┐│
    17. // ││
    18. println!("borrow2: {}", borrow2); // ││
    19. } // `borrow2` 结束。─────────────────────────────────┘│
    20. // │
    21. } // 生命周期结束。 ─────────────────────────────────────┘

    注意到这里没有用到名称或类型来标记生命周期,这限制了生命周期的表现能力,在后面我们将会看到生命周期更强大的功能。