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」