函式呼叫中的生命週期

參照的「生命週期」不得「超過」其所參照的值。此由借用檢查器負責驗證。

按照我們目前所見,生命週期可以隱晦表示。不過,&'a Point&'document str 也可以明確表示生命週期。生命週期的開頭為 ',一般預設名稱為 'a。請將 ``&'a Point讀做「至少對生命週期a有效的借用Point`」。

Lifetimes are always inferred by the compiler: you cannot assign a lifetime yourself. Explicit lifetime annotations create constraints where there is ambiguity; the compiler verifies that there is a valid solution.

在考慮與函式間傳遞值時,生命週期會變得比較複雜。

#[derive(Debug)]
struct Point(i32, i32);

fn left_most(p1: &Point, p2: &Point) -> &Point {
    if p1.0 < p2.0 {
        p1
    } else {
        p2
    }
}

fn main() {
    let p1: Point = Point(10, 10);
    let p2: Point = Point(20, 20);
    let p3 = left_most(&p1, &p2); // What is the lifetime of p3?
    println!("p3: {p3:?}");
}
This slide should take about 10 minutes.

在本例中,編譯器無法堆論出 p3 到底有多長的生命週期。查看函式主體內部後顯示,編譯器只有把握假設 p3 的生命週期是 p1p2 中的較短那個。但就像型別一樣,Rust 規定要對函式引數和回傳值的生命週期加上明確註解。

請將 'a 妥善新增至 left_most

fn left_most<'a>(p1: &'a Point, p2: &'a Point) -> &'a Point {

這表示,「假設 p1 和 p2 都比 'a 長」,回傳值的生命週期至少會為 'a

一般情況下可以省略生命週期,詳情請見下一張投影片。