iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0

昨天介紹了該怎麼使用生命週期的標記

今天來看一下生命週期省略

之前有介紹在,函式返回值的生命週期,

有幾個狀況不需要特別標記,這邊再來複習並且補充

不需要特別標記生命週期的狀況

  1. 當函式中只有一個參數時,返回值有參照參數的話

Rust 就會知道返回值與參數的生命週期一樣,就不需要特別標記

  1. 函式中有多個參數時,只有一個借用參數,返回值也參照此參數

Rust 會知道返回值與其中一個借用參數的生命週期一樣,也不需要特別標記

  1. 函式中多個參數,都是借用參數,但返回值不參照這些參數

如果返回值沒有參照參數,那麼返回值就可能會是函式裡面的一個變數,

這時候返回值與變數的作用域相同,就不用擔心借用到無效的值

生命週期省略

在初期,Rust 會嚴格要求開發者們函式裡的借用參數都必須要標記生命週期

不過這樣寫下來,程式碼會變得又臭又長,被反應多次之後,

Rust 編輯器在接觸到剛剛提到的狀況後,可以清楚知道生命週期,

我們就不需要在這些狀況發生時標註生命週期

在這背後,編譯器使用了生命週期省略的規則

反之,編譯器無法確定該返回值生命週期,就會報錯,這時候你就得加上標記了

省略規則

在 Rust 中,參數的生命週期被稱為輸入生命週期,而返回值被稱為輸出生命週期,名稱蠻符合函式的規則,函式本身就是有輸入才有輸出,而這邊的命名非常貼切

省略規則指的是什麼?

指的是就算我們今天沒有給生命週期標記,Rust 可以自動推斷出它

有三個狀況會應用到省略規則

  1. 每個借用參數都有自己的生命週期

每個參數都有自己的生命週期後, Rust 就會依據個別的生命週期來自動推斷

fn introduction<'a, 'b>(a: &'a i32, b: &'b i32)
  1. 只有一個借用參數,輸入生命週期就會等於輸出生命週期

在我們剛剛介紹的 不需要特別標記生命週期的狀況 前面兩種狀況就符合此點

  1. 多個借用參數時,其中一個是 &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 的生命週期一樣


上一篇
Day 21 - 生命週期 Part 3
下一篇
Day 23 - Module part 1
系列文
成為程式界的 F1 賽車手,用 30 天認識 Rust 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言