Day 6:生命週期省略與常用場景

學習目標

  • 知道生命週期省略規則
  • 使用 'static
  • 掌握常用生命週期場景

今日重點

生命週期省略(Lifetime Elision)

很多時候編譯器能自己推出來,你不用寫。規則: 1. 每個 輸入 引用都有自己隱含的生命週期參數 2. 只有一個輸入引用時,它被指派為**輸出**引用的生命週期 3. 多個輸入、且其中一個是 &self 時,輸出引用跟著 &self

// 以下都不用寫 'a,編譯器自動推導
fn len(s: &str) -> usize { s.len() }
fn first_word(s: &str) -> &str { &s[..] }
impl User { fn name(&self) -> &str { &self.username } }

'static 生命週期

'static 表示引用存活在整個程式期間。**字串字面值**就是 'static

let s: &'static str = "hello";   // 字串字面值是 'static
注意:不是所有 &str 都是 'static,能用到盡量用,回傳 'static 要確定資料真的永遠存在。

結構體持有多個引用

struct Reader<'a, 'b> {
    file: &'a str,
    buf: &'b mut String,
}

練習

// 1. 哪些需要寫生命週期、哪些省略?判斷後用編譯器驗證。
fn get<'a>(list: &[&'a str], i: usize) -> &'a str { list[i] }

// 2. 寫一個結構體,持有一個 String 的借用(&str),並為它實作方法。
struct Wrapper<'a> { text: &'a str }
impl<'a> Wrapper<'a> {
    fn trim(&self) -> &str { self.text.trim() }
}

自我檢查

  • 能說出三條省略規則
  • 知道字串字面值是 'static
  • 能判斷哪些情況必須手寫生命週期
  • 會寫持有引用欄位的結構體

深入連結

  • The Book 第 10 章「Lifetime Elision / The Static Lifetime」