昨天介紹了該怎麼使用生命週期的標記
今天來看一下生命週期省略
之前有介紹在,函式返回值的生命週期,
有幾個狀況不需要特別標記,這邊再來複習並且補充
Rust 就會知道返回值與參數的生命週期一樣,就不需要特別標記
Rust 會知道返回值與其中一個借用參數的生命週期一樣,也不需要特別標記
如果返回值沒有參照參數,那麼返回值就可能會是函式裡面的一個變數,
這時候返回值與變數的作用域相同,就不用擔心借用到無效的值
在初期,Rust 會嚴格要求開發者們函式裡的借用參數都必須要標記生命週期
不過這樣寫下來,程式碼會變得又臭又長,被反應多次之後,
Rust 編輯器在接觸到剛剛提到的狀況後,可以清楚知道生命週期,
我們就不需要在這些狀況發生時標註生命週期
在這背後,編譯器使用了生命週期省略的規則
反之,編譯器無法確定該返回值生命週期,就會報錯,這時候你就得加上標記了
在 Rust 中,參數的生命週期被稱為輸入生命週期,而返回值被稱為輸出生命週期,名稱蠻符合函式的規則,函式本身就是有輸入才有輸出,而這邊的命名非常貼切
省略規則指的是什麼?
指的是就算我們今天沒有給生命週期標記,Rust 可以自動推斷出它
有三個狀況會應用到省略規則
每個參數都有自己的生命週期後, Rust 就會依據個別的生命週期來自動推斷
fn introduction<'a, 'b>(a: &'a i32, b: &'b i32)
在我們剛剛介紹的 不需要特別標記生命週期的狀況
前面兩種狀況就符合此點
&self
或是 &mut self
時,這個輸入生命週期就會等於輸出生命週期&self
指的是我們可以在結構或枚舉中使用 impl 時,指向結構中的資料
以下面例子來看,當 Friend 這個結構的實例呼叫方法,並且參數為 &self 時,表示參照 Friend 實例他自己的結構(但不可修改)
當我們在傳遞 self.name 給 Function 當參數時,這個參數的作用域為此 Function ,因此生命週期在 Function 執行後結束
fn main() {
struct Friend {
name: String,
}
impl Friend {
fn true_friend(&self) {
println!("My friend is {}", self.name);
}
}
let my_friend = Friend {
name: "Amy".to_string(),
};
my_friend.true_friend();
}
假設 true_friend
有返回值,且返回參照,例如 &self.name
,返回值將會與 &self 的生命週期一樣